fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER START
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The contents of this file are subject to the terms of the
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling * Common Development and Distribution License (the "License").
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling * You may not use this file except in compliance with the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fa9e4066f08beec538e775443c5be79dd423fcabahrens * or http://www.opensolaris.org/os/licensing.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * See the License for the specific language governing permissions
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and limitations under the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * When distributing Covered Code, include this CDDL HEADER in each
fa9e4066f08beec538e775443c5be79dd423fcabahrens * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If applicable, add the following below this CDDL HEADER, with the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * fields enclosed by brackets "[]" replaced with your own identifying
fa9e4066f08beec538e775443c5be79dd423fcabahrens * information: Portions Copyright [yyyy] [name of copyright owner]
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER END
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
18ce54df8809e9f672d0ed1a53e99669df0a6df0ek * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Use is subject to license terms.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <stdio.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <stdlib.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <string.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <unistd.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "isns_server.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "isns_msgq.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "isns_cache.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "isns_cfg.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "isns_obj.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "isns_dseng.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "isns_log.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "isns_scn.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "isns_pdu.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * global variables.
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks */
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
b1b8ab34de515a5e83206da22c3d7e563241b021lling/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * local variables.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic scn_registry_t *scn_registry = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int scn_dispatched = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
b7b97454b9b1f6625e7e655e9651e744a8dee09dperrin * external variables.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern uint8_t mgmt_scn;
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern msg_queue_t *sys_q;
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern msg_queue_t *scn_q;
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern const int UID_ATTR_INDEX[MAX_OBJ_TYPE_FOR_SIZE];
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef DEBUG
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void dump_pdu1(isns_pdu_t *);
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int sf_gen(scn_raw_t *);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int sf_error(scn_raw_t *);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockstatic scn_raw_t *make_raw_entity(isns_obj_t *);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic scn_raw_t *make_raw_iscsi(isns_obj_t *);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic scn_raw_t *make_raw_portal(isns_obj_t *);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic scn_raw_t *make_raw_assoc_iscsi(isns_obj_t *);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic scn_raw_t *make_raw_assoc_dd(isns_obj_t *);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic scn_raw_t *(*const make_raw[MAX_OBJ_TYPE_FOR_SIZE])(isns_obj_t *) = {
fa9e4066f08beec538e775443c5be79dd423fcabahrens NULL,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &make_raw_entity,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &make_raw_iscsi,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &make_raw_portal,
fa9e4066f08beec538e775443c5be79dd423fcabahrens NULL, /* OBJ_PG */
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock NULL, /* OBJ_DD */
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock NULL, /* OBJ_DDS */
06eeb2ad640ce72d394ac521094bed7681044408ek NULL, /* MAX_OBJ_TYPE */
06eeb2ad640ce72d394ac521094bed7681044408ek NULL, /* OBJ_DUMMY1 */
b1b8ab34de515a5e83206da22c3d7e563241b021lling NULL, /* OBJ_DUMMY2 */
b1b8ab34de515a5e83206da22c3d7e563241b021lling NULL, /* OBJ_DUMMY3 */
b1b8ab34de515a5e83206da22c3d7e563241b021lling NULL, /* OBJ_DUMMY4 */
fa9e4066f08beec538e775443c5be79dd423fcabahrens &make_raw_assoc_iscsi,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &make_raw_assoc_dd
fa9e4066f08beec538e775443c5be79dd423fcabahrens};
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic scn_text_t *scn_gen_entity(scn_raw_t *);
99653d4ee642c6528e88224f12409a5f23060994eschrockstatic scn_text_t *scn_gen_iscsi(scn_raw_t *);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic scn_text_t *scn_gen_portal(scn_raw_t *);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic scn_text_t *scn_gen_assoc_dd(scn_raw_t *);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic scn_text_t *(*const scn_gen[MAX_OBJ_TYPE_FOR_SIZE])(scn_raw_t *) = {
fa9e4066f08beec538e775443c5be79dd423fcabahrens NULL,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &scn_gen_entity,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &scn_gen_iscsi,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &scn_gen_portal,
fa9e4066f08beec538e775443c5be79dd423fcabahrens NULL, /* OBJ_PG */
fa9e4066f08beec538e775443c5be79dd423fcabahrens NULL, /* OBJ_DD */
fa9e4066f08beec538e775443c5be79dd423fcabahrens NULL, /* OBJ_DDS */
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock NULL, /* MAX_OBJ_TYPE */
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock NULL, /* OBJ_DUMMY1 */
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock NULL, /* OBJ_DUMMY2 */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock NULL, /* OBJ_DUMMY3 */
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock NULL, /* OBJ_DUMMY4 */
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock &scn_gen_iscsi,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock &scn_gen_assoc_dd
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock};
06eeb2ad640ce72d394ac521094bed7681044408ek
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock#define SCN_TEST(E, BITMAP, UID1, UID2, NT) \
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock (((E) & (BITMAP)) && \
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock (!((BITMAP) & (ISNS_INIT_SELF_INFO_ONLY | \
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock ISNS_TARGET_SELF_INFO_ONLY)) || \
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock ((UID1) == (UID2)) || \
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock (((BITMAP) & ISNS_INIT_SELF_INFO_ONLY) && \
99653d4ee642c6528e88224f12409a5f23060994eschrock ((NT) & ISNS_INITIATOR_NODE_TYPE)) || \
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock (((BITMAP) & ISNS_TARGET_SELF_INFO_ONLY) && \
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock ((NT) & ISNS_TARGET_NODE_TYPE))))
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling/*
b1b8ab34de515a5e83206da22c3d7e563241b021lling * local functions.
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock */
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * free_portal_1:
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * Free one SCN portal or decrease the reference count if the portal
fa9e4066f08beec538e775443c5be79dd423fcabahrens * is referenced by other SCN entry(s).
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * p - the portal.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * ****************************************************************************
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock */
65cd9f2809a015b46790a9c5c2ef992d56177624eschrockstatic void
65cd9f2809a015b46790a9c5c2ef992d56177624eschrockfree_portal_1(
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock scn_portal_t *p
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (p->ref <= 1) {
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock if (p->sz == sizeof (in6_addr_t)) {
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock free(p->ip.in6);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock free(p);
99653d4ee642c6528e88224f12409a5f23060994eschrock } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens p->ref --;
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock }
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock}
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * ****************************************************************************
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock *
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * free_portal:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Free the unused portals, which are extracted for new SCN entry,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * after the new SCN entry is added.
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock *
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * p - the portal.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
65cd9f2809a015b46790a9c5c2ef992d56177624eschrockstatic void
65cd9f2809a015b46790a9c5c2ef992d56177624eschrockfree_portal(
06eeb2ad640ce72d394ac521094bed7681044408ek scn_portal_t *p
06eeb2ad640ce72d394ac521094bed7681044408ek)
b1b8ab34de515a5e83206da22c3d7e563241b021lling{
b1b8ab34de515a5e83206da22c3d7e563241b021lling scn_portal_t *n;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (p != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens n = p->next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens free_portal_1(p);
fa9e4066f08beec538e775443c5be79dd423fcabahrens p = n;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
2a6b87f07ac0c0b819179c84afe5a60afa04cfa5ek}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock/*
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * ****************************************************************************
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock *
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * free_portal_list:
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * Free the list of portals while a SCN entry is being destroyed.
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock *
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * l - the portal list.
e45ce728996d8e573eecb27f555fb86aaff0cafdahrens *
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * ****************************************************************************
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock */
65cd9f2809a015b46790a9c5c2ef992d56177624eschrockstatic void
990b4856d0eaada6f8140335733a1b1771ed2746llingfree_portal_list(
990b4856d0eaada6f8140335733a1b1771ed2746lling scn_list_t *l
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock)
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock{
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock scn_list_t *n;
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock scn_portal_t *p;
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock while (l != NULL) {
06eeb2ad640ce72d394ac521094bed7681044408ek n = l->next;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks p = l->data.portal;
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock free_portal_1(p);
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm free(l);
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock l = n;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock }
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock}
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock/*
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * ****************************************************************************
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock *
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * free_scn_text:
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * Free one SCN or decrease the ref count after the SCN is emitted.
990b4856d0eaada6f8140335733a1b1771ed2746lling *
990b4856d0eaada6f8140335733a1b1771ed2746lling * text - the SCN.
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock *
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling * ****************************************************************************
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock */
441d80aa4f613b6298fc8bd3151f4be02dbf84fcllingstatic void
65cd9f2809a015b46790a9c5c2ef992d56177624eschrockfree_scn_text(
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock scn_text_t *text
e45ce728996d8e573eecb27f555fb86aaff0cafdahrens)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (text->ref <= 1) {
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock free(text->iscsi);
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock free(text);
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock } else {
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock text->ref --;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock}
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
990b4856d0eaada6f8140335733a1b1771ed2746lling/*
b1b8ab34de515a5e83206da22c3d7e563241b021lling * ****************************************************************************
e45ce728996d8e573eecb27f555fb86aaff0cafdahrens *
b1b8ab34de515a5e83206da22c3d7e563241b021lling * free_scn_list:
b1b8ab34de515a5e83206da22c3d7e563241b021lling * Free the the list of SCN.
b1b8ab34de515a5e83206da22c3d7e563241b021lling *
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * scn - the list.
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock *
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * ****************************************************************************
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock */
65cd9f2809a015b46790a9c5c2ef992d56177624eschrockstatic void
65cd9f2809a015b46790a9c5c2ef992d56177624eschrockfree_scn_list(
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_t *scn
b1b8ab34de515a5e83206da22c3d7e563241b021lling)
b1b8ab34de515a5e83206da22c3d7e563241b021lling{
b1b8ab34de515a5e83206da22c3d7e563241b021lling scn_t *next_scn;
990b4856d0eaada6f8140335733a1b1771ed2746lling scn_list_t *list;
990b4856d0eaada6f8140335733a1b1771ed2746lling scn_list_t *next_list;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling while (scn != NULL) {
b1b8ab34de515a5e83206da22c3d7e563241b021lling next_scn = scn->next;
b1b8ab34de515a5e83206da22c3d7e563241b021lling list = scn->data.list;
b1b8ab34de515a5e83206da22c3d7e563241b021lling while (list != NULL) {
990b4856d0eaada6f8140335733a1b1771ed2746lling next_list = list->next;
990b4856d0eaada6f8140335733a1b1771ed2746lling free_scn_text(list->data.text);
990b4856d0eaada6f8140335733a1b1771ed2746lling free(list);
990b4856d0eaada6f8140335733a1b1771ed2746lling list = next_list;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
b1b8ab34de515a5e83206da22c3d7e563241b021lling free(scn);
b1b8ab34de515a5e83206da22c3d7e563241b021lling scn = next_scn;
b1b8ab34de515a5e83206da22c3d7e563241b021lling }
b1b8ab34de515a5e83206da22c3d7e563241b021lling}
b1b8ab34de515a5e83206da22c3d7e563241b021lling
990b4856d0eaada6f8140335733a1b1771ed2746lling/*
b1b8ab34de515a5e83206da22c3d7e563241b021lling * ****************************************************************************
b1b8ab34de515a5e83206da22c3d7e563241b021lling *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * free_scn:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Free all of SCNs which are dispatched to every entry.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void
99653d4ee642c6528e88224f12409a5f23060994eschrockfree_scn(
fa9e4066f08beec538e775443c5be79dd423fcabahrens)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_registry_t *p;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens p = scn_registry;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (p != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens free_scn_list(p->scn);
fa9e4066f08beec538e775443c5be79dd423fcabahrens p->scn = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens p = p->next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * free_entry:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Free one SCN entry.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * e - the SCN entry.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
b1b8ab34de515a5e83206da22c3d7e563241b021lling */
b1b8ab34de515a5e83206da22c3d7e563241b021llingstatic void
990b4856d0eaada6f8140335733a1b1771ed2746llingfree_entry(
990b4856d0eaada6f8140335733a1b1771ed2746lling scn_registry_t *e
b1b8ab34de515a5e83206da22c3d7e563241b021lling)
b1b8ab34de515a5e83206da22c3d7e563241b021lling{
b1b8ab34de515a5e83206da22c3d7e563241b021lling free_scn_list(e->scn);
b1b8ab34de515a5e83206da22c3d7e563241b021lling free_portal_list(e->portal.l);
990b4856d0eaada6f8140335733a1b1771ed2746lling free(e->name);
990b4856d0eaada6f8140335733a1b1771ed2746lling free(e);
b1b8ab34de515a5e83206da22c3d7e563241b021lling}
b1b8ab34de515a5e83206da22c3d7e563241b021lling
990b4856d0eaada6f8140335733a1b1771ed2746lling/*
990b4856d0eaada6f8140335733a1b1771ed2746lling * ****************************************************************************
b1b8ab34de515a5e83206da22c3d7e563241b021lling *
b1b8ab34de515a5e83206da22c3d7e563241b021lling * free_raw:
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * Free the raw data after the SCN is generated from it.
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock *
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * raw - the raw SCN data.
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock *
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * ****************************************************************************
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock */
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrockstatic void
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrockfree_raw(
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_raw_t *raw
fa9e4066f08beec538e775443c5be79dd423fcabahrens)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (raw->ref == 0) {
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin free(raw->iscsi);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (raw->ip != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(raw->ip);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock free(raw);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * scn_add_portal:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Add portals to the portal list of a SCN entry.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock * e - the SCN entry.
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * p - the portals.
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * return - 0: successful, otherwise failed.
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin *
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * ****************************************************************************
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin */
8654d0253136055bd4cc2423d87378e8a37f2eb5perrinstatic int
8654d0253136055bd4cc2423d87378e8a37f2eb5perrinscn_add_portal(
99653d4ee642c6528e88224f12409a5f23060994eschrock scn_registry_t *e,
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin scn_portal_t *p
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin)
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock{
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock scn_portal_t *x;
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_list_t *l, *m;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling scn_list_t **lp;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling int found_it;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling lp = &e->portal.l;
990b4856d0eaada6f8140335733a1b1771ed2746lling while (p != NULL) {
990b4856d0eaada6f8140335733a1b1771ed2746lling m = (scn_list_t *)malloc(sizeof (scn_list_t));
990b4856d0eaada6f8140335733a1b1771ed2746lling if (m == NULL) {
990b4856d0eaada6f8140335733a1b1771ed2746lling return (1);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling found_it = 0;
990b4856d0eaada6f8140335733a1b1771ed2746lling e = scn_registry;
990b4856d0eaada6f8140335733a1b1771ed2746lling while (e && !found_it) {
990b4856d0eaada6f8140335733a1b1771ed2746lling l = e->portal.l;
990b4856d0eaada6f8140335733a1b1771ed2746lling while (l && !found_it) {
990b4856d0eaada6f8140335733a1b1771ed2746lling x = l->data.portal;
990b4856d0eaada6f8140335733a1b1771ed2746lling if (x->uid == p->uid) {
990b4856d0eaada6f8140335733a1b1771ed2746lling found_it = 1;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling l = l->next;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling e = e->next;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling if (!found_it) {
990b4856d0eaada6f8140335733a1b1771ed2746lling x = p;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock m->data.portal = x;
990b4856d0eaada6f8140335733a1b1771ed2746lling x->ref ++;
990b4856d0eaada6f8140335733a1b1771ed2746lling m->next = *lp;
990b4856d0eaada6f8140335733a1b1771ed2746lling *lp = m;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling p = p->next;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling return (0);
990b4856d0eaada6f8140335733a1b1771ed2746lling}
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling/*
990b4856d0eaada6f8140335733a1b1771ed2746lling * ****************************************************************************
990b4856d0eaada6f8140335733a1b1771ed2746lling *
990b4856d0eaada6f8140335733a1b1771ed2746lling * scn_remove_portal:
990b4856d0eaada6f8140335733a1b1771ed2746lling * Remove a portal from the portal list of every SCN entry.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * uid - the portal object uid.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - always successful (0).
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensscn_remove_portal(
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t uid
fa9e4066f08beec538e775443c5be79dd423fcabahrens)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_registry_t **ep, *e;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_portal_t *x;
99653d4ee642c6528e88224f12409a5f23060994eschrock scn_list_t **lp, *l;
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens ep = &scn_registry;
fa9e4066f08beec538e775443c5be79dd423fcabahrens e = *ep;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (e != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens lp = &e->portal.l;
fa9e4066f08beec538e775443c5be79dd423fcabahrens l = *lp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (l != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens x = l->data.portal;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (x->uid == uid) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* remove it */
fa9e4066f08beec538e775443c5be79dd423fcabahrens *lp = l->next;
99653d4ee642c6528e88224f12409a5f23060994eschrock free_portal_1(x);
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(l);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
99653d4ee642c6528e88224f12409a5f23060994eschrock lp = &l->next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens l = *lp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock if (e->portal.l == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* no portal for this entry, destroy it */
fa9e4066f08beec538e775443c5be79dd423fcabahrens *ep = e->next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens free_entry(e);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ep = &e->next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens e = *ep;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
99653d4ee642c6528e88224f12409a5f23060994eschrock * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * scn_list_add:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Add one SCN entry to the SCN entry list.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * e - the SCN entry.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - always successful (0).
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
99653d4ee642c6528e88224f12409a5f23060994eschrock * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrockscn_list_add(
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_registry_t *e
fa9e4066f08beec538e775443c5be79dd423fcabahrens)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_registry_t **pp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_portal_t *p;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens p = e->portal.p;
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor e->portal.l = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pp = &scn_registry;
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (*pp) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((*pp)->uid == e->uid) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* replace the bitmap */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (*pp)->bitmap = e->bitmap;
fa9e4066f08beec538e775443c5be79dd423fcabahrens free_portal(p);
fa9e4066f08beec538e775443c5be79dd423fcabahrens free_entry(e);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else if ((*pp)->uid < e->uid) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens pp = &(*pp)->next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin (void) scn_add_portal(e, p);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin if (e->portal.l != NULL || sys_q == NULL) {
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin /* insert it to the list */
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin e->next = *pp;
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin *pp = e;
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin } else {
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin /* no portal, ignore it */
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin free_entry(e);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* free the unused portal(s) */
fa9e4066f08beec538e775443c5be79dd423fcabahrens free_portal(p);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock/*
99653d4ee642c6528e88224f12409a5f23060994eschrock * ****************************************************************************
99653d4ee642c6528e88224f12409a5f23060994eschrock *
99653d4ee642c6528e88224f12409a5f23060994eschrock * scn_list_remove:
99653d4ee642c6528e88224f12409a5f23060994eschrock * Remove one SCN entry from the SCN entry list.
99653d4ee642c6528e88224f12409a5f23060994eschrock *
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan * uid - the SCN entry unique ID.
99653d4ee642c6528e88224f12409a5f23060994eschrock * return - always successful (0).
99653d4ee642c6528e88224f12409a5f23060994eschrock *
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan * ****************************************************************************
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan */
99653d4ee642c6528e88224f12409a5f23060994eschrockstatic int
99653d4ee642c6528e88224f12409a5f23060994eschrockscn_list_remove(
99653d4ee642c6528e88224f12409a5f23060994eschrock uint32_t uid
99653d4ee642c6528e88224f12409a5f23060994eschrock)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan scn_registry_t **ep, *e;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock ep = &scn_registry;
99653d4ee642c6528e88224f12409a5f23060994eschrock e = *ep;
99653d4ee642c6528e88224f12409a5f23060994eschrock while (e) {
99653d4ee642c6528e88224f12409a5f23060994eschrock if (e->uid == uid) {
99653d4ee642c6528e88224f12409a5f23060994eschrock /* destroy it */
99653d4ee642c6528e88224f12409a5f23060994eschrock *ep = e->next;
99653d4ee642c6528e88224f12409a5f23060994eschrock free_entry(e);
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock } else if (e->uid < uid) {
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock ep = &e->next;
99653d4ee642c6528e88224f12409a5f23060994eschrock e = *ep;
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock return (0);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock/*
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan * ****************************************************************************
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan *
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan * cb_get_scn_port:
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan * The callback function which returns the SCN port of a portal object.
99653d4ee642c6528e88224f12409a5f23060994eschrock *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * p1 - the portal object.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * p2 - the lookup control data.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - the SCN port number.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
990b4856d0eaada6f8140335733a1b1771ed2746lling * ****************************************************************************
990b4856d0eaada6f8140335733a1b1771ed2746lling */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrenscb_get_scn_port(
fa9e4066f08beec538e775443c5be79dd423fcabahrens void *p1,
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*ARGSUSED*/
fa9e4066f08beec538e775443c5be79dd423fcabahrens void *p2
fa9e4066f08beec538e775443c5be79dd423fcabahrens)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
990b4856d0eaada6f8140335733a1b1771ed2746lling isns_obj_t *obj = (isns_obj_t *)p1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
b1b8ab34de515a5e83206da22c3d7e563241b021lling isns_attr_t *attr = &obj->attrs[
fa9e4066f08beec538e775443c5be79dd423fcabahrens ATTR_INDEX_PORTAL(ISNS_SCN_PORT_ATTR_ID)];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens int port = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (attr->tag != 0 && attr->value.ui != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens port = (int)attr->value.ui;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock return (port);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
990b4856d0eaada6f8140335733a1b1771ed2746lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
990b4856d0eaada6f8140335733a1b1771ed2746lling * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * new_scn_portal:
990b4856d0eaada6f8140335733a1b1771ed2746lling * Make a new SCN portal.
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ref - the ref count.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * uid - the portal object UID.
990b4856d0eaada6f8140335733a1b1771ed2746lling * ip - the ip address.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * port - the port number.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - the SCN portal.
99653d4ee642c6528e88224f12409a5f23060994eschrock *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
99653d4ee642c6528e88224f12409a5f23060994eschrockstatic scn_portal_t *
fa9e4066f08beec538e775443c5be79dd423fcabahrensnew_scn_portal(
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t ref,
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t uid,
990b4856d0eaada6f8140335733a1b1771ed2746lling in6_addr_t *ip,
990b4856d0eaada6f8140335733a1b1771ed2746lling uint32_t port
990b4856d0eaada6f8140335733a1b1771ed2746lling)
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock{
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock scn_portal_t *p;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock p = (scn_portal_t *)malloc(sizeof (scn_portal_t));
990b4856d0eaada6f8140335733a1b1771ed2746lling if (p != NULL) {
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock p->uid = uid;
990b4856d0eaada6f8140335733a1b1771ed2746lling /* convert the ipv6 to ipv4 */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (((int *)ip)[0] == 0x00 &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((int *)ip)[1] == 0x00 &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((uchar_t *)ip)[8] == 0x00 &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((uchar_t *)ip)[9] == 0x00 &&
990b4856d0eaada6f8140335733a1b1771ed2746lling ((uchar_t *)ip)[10] == 0xFF &&
990b4856d0eaada6f8140335733a1b1771ed2746lling ((uchar_t *)ip)[11] == 0xFF) {
990b4856d0eaada6f8140335733a1b1771ed2746lling p->sz = sizeof (in_addr_t);
990b4856d0eaada6f8140335733a1b1771ed2746lling p->ip.in = ((uint32_t *)ip)[3];
990b4856d0eaada6f8140335733a1b1771ed2746lling free(ip);
990b4856d0eaada6f8140335733a1b1771ed2746lling } else {
990b4856d0eaada6f8140335733a1b1771ed2746lling p->sz = sizeof (in6_addr_t);
990b4856d0eaada6f8140335733a1b1771ed2746lling p->ip.in6 = ip;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling p->port = port;
990b4856d0eaada6f8140335733a1b1771ed2746lling p->ref = ref;
990b4856d0eaada6f8140335733a1b1771ed2746lling p->so = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens p->next = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling return (p);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
990b4856d0eaada6f8140335733a1b1771ed2746lling * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * extract scn_portal:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Extract the SCN portal(s) for a storage node.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * name - the storage node name.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - the SCN portal list.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
990b4856d0eaada6f8140335733a1b1771ed2746llingstatic scn_portal_t *
fa9e4066f08beec538e775443c5be79dd423fcabahrensextract_scn_portal(
fa9e4066f08beec538e775443c5be79dd423fcabahrens uchar_t *name
fa9e4066f08beec538e775443c5be79dd423fcabahrens)
990b4856d0eaada6f8140335733a1b1771ed2746lling{
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_portal_t *list = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_portal_t *p;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens lookup_ctrl_t lc_pg, lc_p;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t pg_uid, uid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens in6_addr_t *ip;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t port;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens lc_pg.type = OBJ_PG;
fa9e4066f08beec538e775443c5be79dd423fcabahrens lc_pg.curr_uid = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens lc_pg.id[0] = ATTR_INDEX_PG(ISNS_PG_ISCSI_NAME_ATTR_ID);
fa9e4066f08beec538e775443c5be79dd423fcabahrens lc_pg.op[0] = OP_STRING;
990b4856d0eaada6f8140335733a1b1771ed2746lling lc_pg.data[0].ptr = name;
fa9e4066f08beec538e775443c5be79dd423fcabahrens lc_pg.op[1] = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens lc_pg.id[1] = ISNS_PG_PORTAL_IP_ADDR_ATTR_ID;
99653d4ee642c6528e88224f12409a5f23060994eschrock lc_pg.id[2] = ISNS_PG_PORTAL_PORT_ATTR_ID;
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens lc_p.type = OBJ_PORTAL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens lc_p.curr_uid = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens lc_p.id[0] = ATTR_INDEX_PORTAL(ISNS_PORTAL_IP_ADDR_ATTR_ID);
99653d4ee642c6528e88224f12409a5f23060994eschrock lc_p.op[0] = OP_MEMORY_IP6;
b7b97454b9b1f6625e7e655e9651e744a8dee09dperrin lc_p.id[1] = ATTR_INDEX_PORTAL(ISNS_PORTAL_PORT_ATTR_ID);
99653d4ee642c6528e88224f12409a5f23060994eschrock lc_p.op[1] = OP_INTEGER;
99653d4ee642c6528e88224f12409a5f23060994eschrock lc_p.op[2] = 0;
99653d4ee642c6528e88224f12409a5f23060994eschrock
990b4856d0eaada6f8140335733a1b1771ed2746lling while (cache_lookup(&lc_pg, &pg_uid, cb_clone_attrs) == 0 &&
99653d4ee642c6528e88224f12409a5f23060994eschrock pg_uid != 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock ip = lc_pg.data[1].ip;
99653d4ee642c6528e88224f12409a5f23060994eschrock port = lc_pg.data[2].ui;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (ip != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens lc_p.data[0].ip = ip;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock lc_p.data[1].ui = port;
990b4856d0eaada6f8140335733a1b1771ed2746lling port = cache_lookup(&lc_p, &uid, cb_get_scn_port);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (port != 0 && uid != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* ref starts from 1 */
fa9e4066f08beec538e775443c5be79dd423fcabahrens p = new_scn_portal(1, uid, ip, port);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (p != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens p->next = list;
fa9e4066f08beec538e775443c5be79dd423fcabahrens list = p;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(ip);
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(p);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* portal not registered or no scn port */
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(ip);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens lc_pg.curr_uid = pg_uid;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (list);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * cb_update_scn_bitmap:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The callback function which updates the SCN Bitmap attribute of
fa9e4066f08beec538e775443c5be79dd423fcabahrens * a storage node object.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * p1 - the storage node object.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * p2 - the lookup control data.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - error code.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
11022c7cf39f3b863e749f3866f6ddcb445c2d05timhcb_update_scn_bitmap(
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh void *p1,
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh void *p2
fa9e4066f08beec538e775443c5be79dd423fcabahrens)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
990b4856d0eaada6f8140335733a1b1771ed2746lling int ec = 0;
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh isns_obj_t *obj = (isns_obj_t *)p1;
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh lookup_ctrl_t *lcp = (lookup_ctrl_t *)p2;
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh int id = ATTR_INDEX_ISCSI(ISNS_ISCSI_SCN_BITMAP_ATTR_ID);
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh isns_attr_t *attr = &obj->attrs[id];
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh uint32_t bitmap = lcp->data[2].ui;
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh if (bitmap != 0) {
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh attr->tag = ISNS_ISCSI_SCN_BITMAP_ATTR_ID;
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh attr->len = 4;
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh } else if (attr->tag == 0) {
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh return (ec);
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens attr->tag = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens attr->len = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens attr->value.ui = bitmap;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (sys_q != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ec = write_data(DATA_UPDATE, obj);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ec);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin/*
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * ****************************************************************************
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * cb_get_node_type:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The callback function which returns the node type attribute of
fa9e4066f08beec538e775443c5be79dd423fcabahrens * a storage node object.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * p1 - the storage node object.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * p2 - the lookup control data.
990b4856d0eaada6f8140335733a1b1771ed2746lling * return - error code.
99653d4ee642c6528e88224f12409a5f23060994eschrock *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrenscb_get_node_type(
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock void *p1,
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock /* LINTED E_FUNC_ARG_UNUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrens void *p2
fa9e4066f08beec538e775443c5be79dd423fcabahrens)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
fa9e4066f08beec538e775443c5be79dd423fcabahrens isns_obj_t *obj = (isns_obj_t *)p1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens isns_attr_t *attr = &obj->attrs[
99653d4ee642c6528e88224f12409a5f23060994eschrock ATTR_INDEX_ISCSI(ISNS_ISCSI_NODE_TYPE_ATTR_ID)];
99653d4ee642c6528e88224f12409a5f23060994eschrock int nt = (int)attr->value.ui;
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (nt);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling/*
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock * ****************************************************************************
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * cb_get_node_type:
990b4856d0eaada6f8140335733a1b1771ed2746lling * The callback function which returns the storage node object UID
990b4856d0eaada6f8140335733a1b1771ed2746lling * from a portal group object.
990b4856d0eaada6f8140335733a1b1771ed2746lling *
990b4856d0eaada6f8140335733a1b1771ed2746lling * p1 - the pg object.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * p2 - the lookup control data.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - the storage node object UID.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrenscb_pg_node(
fa9e4066f08beec538e775443c5be79dd423fcabahrens void *p1,
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* LINTED E_FUNC_ARG_UNUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrens void *p2
fa9e4066f08beec538e775443c5be79dd423fcabahrens)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
99653d4ee642c6528e88224f12409a5f23060994eschrock uint32_t ref;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens ref = get_ref_t(p1, OBJ_ISCSI);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return ((int)ref);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
99653d4ee642c6528e88224f12409a5f23060994eschrock * make_raw_entity:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Make raw SCN data with a Network Entity object.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * obj - the network entity object.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - the raw SCN data.
99653d4ee642c6528e88224f12409a5f23060994eschrock *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic scn_raw_t *
fa9e4066f08beec538e775443c5be79dd423fcabahrensmake_raw_entity(
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*ARGSUSED*/
fa9e4066f08beec538e775443c5be79dd423fcabahrens isns_obj_t *obj
fa9e4066f08beec538e775443c5be79dd423fcabahrens)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_raw_t *raw;
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw = (scn_raw_t *)malloc(sizeof (scn_raw_t));
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (raw != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->type = obj->type;
99653d4ee642c6528e88224f12409a5f23060994eschrock raw->uid = get_obj_uid(obj);
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->iscsi = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->ref = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->ilen = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->nt = 0;
99653d4ee642c6528e88224f12409a5f23060994eschrock raw->ip = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->dd_id = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->dds_id = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens isnslog(LOG_DEBUG, "make_raw_entity", "malloc failed.");
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (raw);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
f3861e1a2ceec23a5b699c24d814b7775a9e0b52ahl * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * make_raw_iscsi:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Make raw SCN data with a Storage Node object.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * obj - the storage node object.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - the raw SCN data.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic scn_raw_t *
fa9e4066f08beec538e775443c5be79dd423fcabahrensmake_raw_iscsi(
fa9e4066f08beec538e775443c5be79dd423fcabahrens isns_obj_t *obj
fa9e4066f08beec538e775443c5be79dd423fcabahrens)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t uid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t nt;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uchar_t *iscsi;
b1b8ab34de515a5e83206da22c3d7e563241b021lling uint32_t ilen;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens isns_attr_t *attr;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_raw_t *raw;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens uid = get_obj_uid(obj);
99653d4ee642c6528e88224f12409a5f23060994eschrock attr = &obj->attrs[ATTR_INDEX_ISCSI(ISNS_ISCSI_NODE_TYPE_ATTR_ID)];
fa9e4066f08beec538e775443c5be79dd423fcabahrens nt = attr->value.ui;
fa9e4066f08beec538e775443c5be79dd423fcabahrens attr = &obj->attrs[ATTR_INDEX_ISCSI(ISNS_ISCSI_NAME_ATTR_ID)];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw = (scn_raw_t *)malloc(sizeof (scn_raw_t));
fa9e4066f08beec538e775443c5be79dd423fcabahrens ilen = attr->len;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi = (uchar_t *)malloc(ilen);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (raw != NULL && iscsi != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* copy the iscsi storage node name */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strcpy((char *)iscsi, (char *)attr->value.ptr);
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->type = obj->type;
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->uid = uid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->iscsi = iscsi;
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->ref = 0;
99653d4ee642c6528e88224f12409a5f23060994eschrock raw->ilen = ilen;
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->nt = nt;
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->ip = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->dd_id = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->dds_id = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(raw);
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(iscsi);
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens isnslog(LOG_DEBUG, "make_raw_iscsi", "malloc failed.");
99653d4ee642c6528e88224f12409a5f23060994eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (raw);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * make_raw_portal:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Make raw SCN data with a Portal object.
f3861e1a2ceec23a5b699c24d814b7775a9e0b52ahl *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * obj - the portal object.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - the raw SCN data.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic scn_raw_t *
fa9e4066f08beec538e775443c5be79dd423fcabahrensmake_raw_portal(
fa9e4066f08beec538e775443c5be79dd423fcabahrens isns_obj_t *obj
fa9e4066f08beec538e775443c5be79dd423fcabahrens)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens isns_attr_t *attr;
fa9e4066f08beec538e775443c5be79dd423fcabahrens in6_addr_t *ip;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t port;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_raw_t *raw;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw = (scn_raw_t *)malloc(sizeof (scn_raw_t));
fa9e4066f08beec538e775443c5be79dd423fcabahrens ip = (in6_addr_t *)malloc(sizeof (in6_addr_t));
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (raw != NULL && ip != NULL) {
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock attr = &obj->attrs[
fa9e4066f08beec538e775443c5be79dd423fcabahrens ATTR_INDEX_PORTAL(ISNS_PORTAL_IP_ADDR_ATTR_ID)];
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) memcpy(ip, attr->value.ip, sizeof (in6_addr_t));
fa9e4066f08beec538e775443c5be79dd423fcabahrens attr = &obj->attrs[
fa9e4066f08beec538e775443c5be79dd423fcabahrens ATTR_INDEX_PORTAL(ISNS_PORTAL_PORT_ATTR_ID)];
fa9e4066f08beec538e775443c5be79dd423fcabahrens port = attr->value.ui;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->type = obj->type;
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->uid = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->iscsi = NULL;
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock raw->ref = 0;
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock raw->ilen = 0;
99653d4ee642c6528e88224f12409a5f23060994eschrock raw->nt = 0;
99653d4ee642c6528e88224f12409a5f23060994eschrock raw->ip = ip;
99653d4ee642c6528e88224f12409a5f23060994eschrock raw->port = port;
99653d4ee642c6528e88224f12409a5f23060994eschrock raw->dd_id = 0;
99653d4ee642c6528e88224f12409a5f23060994eschrock raw->dds_id = 0;
99653d4ee642c6528e88224f12409a5f23060994eschrock } else {
99653d4ee642c6528e88224f12409a5f23060994eschrock free(ip);
99653d4ee642c6528e88224f12409a5f23060994eschrock free(raw);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan raw = NULL;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan isnslog(LOG_DEBUG, "make_raw_portal", "malloc failed.");
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan }
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan return (raw);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan}
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
99653d4ee642c6528e88224f12409a5f23060994eschrock *
99653d4ee642c6528e88224f12409a5f23060994eschrock * make_raw_assoc_iscsi:
99653d4ee642c6528e88224f12409a5f23060994eschrock * Make raw SCN data with a Discovery Domain member association.
99653d4ee642c6528e88224f12409a5f23060994eschrock *
99653d4ee642c6528e88224f12409a5f23060994eschrock * obj - the member association object.
99653d4ee642c6528e88224f12409a5f23060994eschrock * return - the raw SCN data.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic scn_raw_t *
fa9e4066f08beec538e775443c5be79dd423fcabahrensmake_raw_assoc_iscsi(
fa9e4066f08beec538e775443c5be79dd423fcabahrens isns_obj_t *obj
fa9e4066f08beec538e775443c5be79dd423fcabahrens)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t uid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t dd_id;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t nt;
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin lookup_ctrl_t lc;
fa9e4066f08beec538e775443c5be79dd423fcabahrens isns_attr_t *attr;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_raw_t *raw;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uchar_t *iscsi;
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock uint32_t ilen;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens uid = get_obj_uid(obj);
fa9e4066f08beec538e775443c5be79dd423fcabahrens dd_id = get_parent_uid(obj);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens SET_UID_LCP(&lc, OBJ_ISCSI, uid);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens nt = cache_lookup(&lc, NULL, cb_get_node_type);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens attr = &obj->attrs[ATTR_INDEX_ASSOC_ISCSI(ISNS_DD_ISCSI_NAME_ATTR_ID)];
990b4856d0eaada6f8140335733a1b1771ed2746lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw = (scn_raw_t *)malloc(sizeof (scn_raw_t));
fa9e4066f08beec538e775443c5be79dd423fcabahrens ilen = attr->len;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock iscsi = (uchar_t *)malloc(ilen);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (raw != NULL && iscsi != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* copy the iscsi storage node name */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strcpy((char *)iscsi, (char *)attr->value.ptr);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->type = obj->type;
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->uid = uid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->iscsi = iscsi;
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->ref = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->ilen = ilen;
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->nt = nt;
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->ip = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->dd_id = dd_id;
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->dds_id = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock free(raw);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock free(iscsi);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock raw = NULL;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock isnslog(LOG_DEBUG, "make_raw_assoc_iscsi", "malloc failed.");
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (raw);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * make_raw_assoc_dd:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Make raw SCN data with a Discovery Domain Set member association.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * obj - the member association object.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - the raw SCN data.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock */
8654d0253136055bd4cc2423d87378e8a37f2eb5perrinstatic scn_raw_t *
8654d0253136055bd4cc2423d87378e8a37f2eb5perrinmake_raw_assoc_dd(
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin isns_obj_t *obj
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin)
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin{
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin scn_raw_t *raw;
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
99653d4ee642c6528e88224f12409a5f23060994eschrock raw = (scn_raw_t *)malloc(sizeof (scn_raw_t));
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock if (raw != NULL) {
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin raw->type = obj->type;
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock raw->uid = 0;
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock raw->iscsi = NULL;
99653d4ee642c6528e88224f12409a5f23060994eschrock raw->ref = 0;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan raw->ilen = 0;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan raw->nt = 0;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan raw->ip = NULL;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan raw->dd_id = get_obj_uid(obj);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan raw->dds_id = get_parent_uid(obj);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan } else {
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan isnslog(LOG_DEBUG, "make_raw_assoc_dd", "malloc failed.");
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan }
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
99653d4ee642c6528e88224f12409a5f23060994eschrock return (raw);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan}
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan/*
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan * ****************************************************************************
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan *
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan * scn_gen_entity:
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan * Generate SCN with the raw SCN data from a Network Entity object.
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan *
99653d4ee642c6528e88224f12409a5f23060994eschrock * raw - the raw SCN data.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - the SCN.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic scn_text_t *
fa9e4066f08beec538e775443c5be79dd423fcabahrensscn_gen_entity(
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* LINTED E_FUNC_ARG_UNUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_raw_t *raw
fa9e4066f08beec538e775443c5be79dd423fcabahrens)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
46657f8d750bdb71753495ce2919170f126b8e34mmusante *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * scn_gen_iscsi:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Generate SCN with the raw SCN data from a Storage Node object.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * raw - the raw SCN data.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - the SCN.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic scn_text_t *
fa9e4066f08beec538e775443c5be79dd423fcabahrensscn_gen_iscsi(
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_raw_t *raw
fa9e4066f08beec538e775443c5be79dd423fcabahrens)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_text_t *text;
990b4856d0eaada6f8140335733a1b1771ed2746lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens text = (scn_text_t *)malloc(sizeof (scn_text_t));
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (text != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens text->flag = 0;
46657f8d750bdb71753495ce2919170f126b8e34mmusante text->ref = 1; /* start with 1 */
46657f8d750bdb71753495ce2919170f126b8e34mmusante text->uid = raw->uid;
46657f8d750bdb71753495ce2919170f126b8e34mmusante text->iscsi = raw->iscsi;
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm raw->ref ++;
b1b8ab34de515a5e83206da22c3d7e563241b021lling text->ilen = raw->ilen;
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm text->nt = raw->nt;
fa9e4066f08beec538e775443c5be79dd423fcabahrens text->dd_id = raw->dd_id;
fa9e4066f08beec538e775443c5be79dd423fcabahrens text->dds_id = raw->dds_id;
fa9e4066f08beec538e775443c5be79dd423fcabahrens text->next = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens isnslog(LOG_DEBUG, "scn_gen_iscsi", "malloc failed.");
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (text);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * scn_gen_portal:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Generate SCN with the raw SCN data from a Portal object.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * raw - the raw SCN data.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - the SCN.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling */
441d80aa4f613b6298fc8bd3151f4be02dbf84fcllingstatic scn_text_t *
441d80aa4f613b6298fc8bd3151f4be02dbf84fcllingscn_gen_portal(
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling scn_raw_t *raw
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling)
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock{
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock in6_addr_t *ip;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock uint32_t port;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock uint32_t pg_uid, uid;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock lookup_ctrl_t pg_lc, lc;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock uint32_t nt;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock uchar_t *name;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock int ilen;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock scn_text_t *text, *l = NULL;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock ip = raw->ip;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek port = raw->port;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek
95173954d2b811ceb583a9012c3b16e1d0dd6438ek pg_lc.curr_uid = 0;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek pg_lc.type = OBJ_PG;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock pg_lc.id[0] = ATTR_INDEX_PG(ISNS_PG_PORTAL_IP_ADDR_ATTR_ID);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock pg_lc.op[0] = OP_MEMORY_IP6;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock pg_lc.data[0].ip = ip;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock pg_lc.id[1] = ATTR_INDEX_PG(ISNS_PG_PORTAL_PORT_ATTR_ID);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock pg_lc.op[1] = OP_INTEGER;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock pg_lc.data[1].ui = port;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pg_lc.op[2] = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens SET_UID_LCP(&lc, OBJ_ISCSI, 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens lc.id[1] = ISNS_ISCSI_NAME_ATTR_ID;
fa9e4066f08beec538e775443c5be79dd423fcabahrens lc.id[2] = ISNS_ISCSI_NODE_TYPE_ATTR_ID;
fa9e4066f08beec538e775443c5be79dd423fcabahrens lc.data[1].ptr = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get a pg which is associated to the portal */
fa9e4066f08beec538e775443c5be79dd423fcabahrens uid = cache_lookup(&pg_lc, &pg_uid, cb_pg_node);
46657f8d750bdb71753495ce2919170f126b8e34mmusante while (pg_uid != 0) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (uid != 0) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock lc.data[0].ui = uid;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) cache_lookup(&lc, NULL, cb_clone_attrs);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock name = lc.data[1].ptr;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (name != NULL) {
95173954d2b811ceb583a9012c3b16e1d0dd6438ek nt = lc.data[2].ui;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek text = (scn_text_t *)malloc(
95173954d2b811ceb583a9012c3b16e1d0dd6438ek sizeof (scn_text_t));
95173954d2b811ceb583a9012c3b16e1d0dd6438ek if (text != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens text->flag = 0;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock text->ref = 1; /* start with 1 */
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock text->uid = uid;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock text->iscsi = name;
46657f8d750bdb71753495ce2919170f126b8e34mmusante ilen = strlen((char *)name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens ilen += 4 - (ilen % 4);
fa9e4066f08beec538e775443c5be79dd423fcabahrens text->ilen = ilen;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock text->nt = nt;
fa9e4066f08beec538e775443c5be79dd423fcabahrens text->dd_id = 0;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock text->dds_id = 0;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock text->next = l;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock l = text;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock } else {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock free(name);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock isnslog(LOG_DEBUG, "scn_gen_portal",
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "malloc failed.");
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock lc.data[1].ptr = NULL;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens isnslog(LOG_WARNING, "scn_gen_portal",
fa9e4066f08beec538e775443c5be79dd423fcabahrens "cannot get node name.");
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get the next pg */
fa9e4066f08beec538e775443c5be79dd423fcabahrens pg_lc.curr_uid = pg_uid;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock uid = cache_lookup(&pg_lc, &pg_uid, cb_pg_node);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
46657f8d750bdb71753495ce2919170f126b8e34mmusante /* update the iscsi storage node object */
46657f8d750bdb71753495ce2919170f126b8e34mmusante raw->event = ISNS_OBJECT_UPDATED;
46657f8d750bdb71753495ce2919170f126b8e34mmusante
46657f8d750bdb71753495ce2919170f126b8e34mmusante return (l);
46657f8d750bdb71753495ce2919170f126b8e34mmusante}
46657f8d750bdb71753495ce2919170f126b8e34mmusante
46657f8d750bdb71753495ce2919170f126b8e34mmusante/*
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * ****************************************************************************
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock *
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * scn_gen_assoc_dd:
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * Generate SCN with the raw SCN data from a DD membership object.
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock *
18ce54df8809e9f672d0ed1a53e99669df0a6df0ek * raw - the raw SCN data.
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * return - the SCN.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic scn_text_t *
fa9e4066f08beec538e775443c5be79dd423fcabahrensscn_gen_assoc_dd(
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* LINTED E_FUNC_ARG_UNUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_raw_t *raw
fa9e4066f08beec538e775443c5be79dd423fcabahrens)
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock{
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin/*
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * ****************************************************************************
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin *
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * make_scn:
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * Make a SCN with an event and an object.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * event - the event.
46657f8d750bdb71753495ce2919170f126b8e34mmusante * obj - the object.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - always successful (0).
46657f8d750bdb71753495ce2919170f126b8e34mmusante *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrensmake_scn(
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t event,
990b4856d0eaada6f8140335733a1b1771ed2746lling isns_obj_t *obj
990b4856d0eaada6f8140335733a1b1771ed2746lling)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_raw_t *raw = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock scn_raw_t *(*f)(isns_obj_t *) = make_raw[obj->type];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (f != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* make raw scn data */
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw = f(obj);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks if (raw != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* trigger an scn event */
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw->event = event;
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) queue_msg_set(scn_q, SCN_SET, (void *)raw);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock}
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
e7437265dc2a4920c197ed4337665539d358b22cahrens/*
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * data structure of the SCN state transition table.
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock */
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrocktypedef struct scn_tbl {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock int state;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek uint32_t event;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek isns_type_t type;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek int (*sf)(scn_raw_t *);
95173954d2b811ceb583a9012c3b16e1d0dd6438ek int next_state;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek} scn_tbl_t;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek
95173954d2b811ceb583a9012c3b16e1d0dd6438ek/*
95173954d2b811ceb583a9012c3b16e1d0dd6438ek * the SCN state transition table.
95173954d2b811ceb583a9012c3b16e1d0dd6438ek */
95173954d2b811ceb583a9012c3b16e1d0dd6438ekstatic const scn_tbl_t stbl[] = {
95173954d2b811ceb583a9012c3b16e1d0dd6438ek { -1, 0, OBJ_PG, NULL, 0 },
95173954d2b811ceb583a9012c3b16e1d0dd6438ek { -1, 0, OBJ_DD, NULL, 0 },
95173954d2b811ceb583a9012c3b16e1d0dd6438ek { -1, 0, OBJ_DDS, NULL, 0 },
95173954d2b811ceb583a9012c3b16e1d0dd6438ek
95173954d2b811ceb583a9012c3b16e1d0dd6438ek { 0, ISNS_OBJECT_ADDED, OBJ_ENTITY, NULL, 1 },
95173954d2b811ceb583a9012c3b16e1d0dd6438ek { 1, ISNS_OBJECT_ADDED, OBJ_ISCSI, sf_gen, 1 },
95173954d2b811ceb583a9012c3b16e1d0dd6438ek { 1, ISNS_OBJECT_ADDED, 0, NULL, 1 },
95173954d2b811ceb583a9012c3b16e1d0dd6438ek
95173954d2b811ceb583a9012c3b16e1d0dd6438ek { 0, ISNS_OBJECT_UPDATED, OBJ_ENTITY, sf_gen, 2 },
95173954d2b811ceb583a9012c3b16e1d0dd6438ek { 2, ISNS_OBJECT_UPDATED, 0, NULL, 2 },
95173954d2b811ceb583a9012c3b16e1d0dd6438ek { 2, ISNS_OBJECT_ADDED, OBJ_ISCSI, sf_gen, 2 },
95173954d2b811ceb583a9012c3b16e1d0dd6438ek { 2, ISNS_OBJECT_ADDED, 0, NULL, 2 },
95173954d2b811ceb583a9012c3b16e1d0dd6438ek
95173954d2b811ceb583a9012c3b16e1d0dd6438ek { 0, ISNS_OBJECT_REMOVED, OBJ_ENTITY, NULL, 3 },
95173954d2b811ceb583a9012c3b16e1d0dd6438ek { 0, ISNS_OBJECT_REMOVED, 0, sf_gen, 4 },
95173954d2b811ceb583a9012c3b16e1d0dd6438ek { 3, ISNS_OBJECT_REMOVED, OBJ_ISCSI, sf_gen, 3 },
95173954d2b811ceb583a9012c3b16e1d0dd6438ek { 3, ISNS_OBJECT_REMOVED, 0, NULL, 3 },
95173954d2b811ceb583a9012c3b16e1d0dd6438ek { 4, ISNS_OBJECT_REMOVED, 0, sf_gen, 4 },
95173954d2b811ceb583a9012c3b16e1d0dd6438ek
95173954d2b811ceb583a9012c3b16e1d0dd6438ek { 0, ISNS_MEMBER_ADDED, OBJ_ASSOC_ISCSI, sf_gen, 5 },
95173954d2b811ceb583a9012c3b16e1d0dd6438ek { 5, ISNS_MEMBER_ADDED, OBJ_ASSOC_ISCSI, sf_gen, 5 },
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens { 0, ISNS_MEMBER_ADDED, OBJ_ASSOC_DD, sf_gen, 6 },
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock { 6, ISNS_MEMBER_ADDED, OBJ_ASSOC_DD, sf_gen, 6 },
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens { 0, ISNS_MEMBER_REMOVED, OBJ_ASSOC_ISCSI, sf_gen, 7 },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { 7, ISNS_MEMBER_REMOVED, OBJ_ASSOC_ISCSI, sf_gen, 7 },
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens { 0, ISNS_MEMBER_REMOVED, OBJ_ASSOC_DD, sf_gen, 8 },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { 8, ISNS_MEMBER_REMOVED, OBJ_ASSOC_DD, sf_gen, 8 },
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens { -1, 0, 0, sf_error, -1 }
f3861e1a2ceec23a5b699c24d814b7775a9e0b52ahl};
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * scn_disp1:
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks * Dispatch one SCN to one SCN entry.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * event - the event.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * p - the SCN entry.
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm * t - the SCN.
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock * return - always successful (0).
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock *
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock * ****************************************************************************
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock */
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrockstatic int
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrockscn_disp1(
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock uint32_t event,
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_registry_t *p,
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_text_t *t
fa9e4066f08beec538e775443c5be79dd423fcabahrens)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm scn_t *s, *r = NULL;
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm scn_list_t *l, **lp;
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm
fa9e4066f08beec538e775443c5be79dd423fcabahrens s = p->scn;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (s != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (s->event == event) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens l = s->data.list;
fa9e4066f08beec538e775443c5be79dd423fcabahrens do {
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock if (l->data.text->uid == t->uid) {
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock /* duplicated */
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock return (0);
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock }
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock lp = &l->next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens l = *lp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } while (l != NULL);
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks }
fa9e4066f08beec538e775443c5be79dd423fcabahrens r = s;
fa9e4066f08beec538e775443c5be79dd423fcabahrens s = s->next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens l = (scn_list_t *)malloc(sizeof (scn_list_t));
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (l != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (s == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens s = (scn_t *)malloc(sizeof (scn_t));
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (s != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens s->event = event;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock s->next = NULL;
99653d4ee642c6528e88224f12409a5f23060994eschrock if (r != NULL) {
99653d4ee642c6528e88224f12409a5f23060994eschrock r->next = s;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
99653d4ee642c6528e88224f12409a5f23060994eschrock p->scn = s;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens lp = &s->data.list;
24e697d414a4df0377b91a2875f029e7b5f97247ck } else {
24e697d414a4df0377b91a2875f029e7b5f97247ck free(l);
990b4856d0eaada6f8140335733a1b1771ed2746lling isnslog(LOG_DEBUG, "scn_disp1",
fa9e4066f08beec538e775443c5be79dd423fcabahrens "malloc scn failed.\n");
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks return (0);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock }
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock t->ref ++;
fa9e4066f08beec538e775443c5be79dd423fcabahrens l->data.text = t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens l->next = NULL;
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock *lp = l;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens isnslog(LOG_DEBUG, "scn_disp1",
99653d4ee642c6528e88224f12409a5f23060994eschrock "malloc list failed.\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock return (0);
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * scn_disp1:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Dispatch one SCN to every SCN entry and update the dispatch status.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * event - the event.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * text - the SCN.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - always successful (0).
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
4c58d71403cebfaa40a572ff12b17668ebd56987darrenmstatic int
99653d4ee642c6528e88224f12409a5f23060994eschrockscn_disp(
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm uint32_t event,
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_text_t *text
99653d4ee642c6528e88224f12409a5f23060994eschrock)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock scn_registry_t *registry, *p;
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock uint32_t dd_id = 0;
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_text_t *t;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling uint32_t e;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling registry = scn_registry;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling t = text;
990b4856d0eaada6f8140335733a1b1771ed2746lling while (t != NULL) {
990b4856d0eaada6f8140335733a1b1771ed2746lling e = event;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (t->flag == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (e & ISNS_MEMBER_ADDED) {
990b4856d0eaada6f8140335733a1b1771ed2746lling e |= ISNS_OBJECT_ADDED;
990b4856d0eaada6f8140335733a1b1771ed2746lling } else if (e & ISNS_MEMBER_REMOVED) {
990b4856d0eaada6f8140335733a1b1771ed2746lling e |= ISNS_OBJECT_REMOVED;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock }
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock }
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock p = registry;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock while (p != NULL) {
990b4856d0eaada6f8140335733a1b1771ed2746lling if (SCN_TEST(e, p->bitmap, p->uid, t->uid, t->nt)) {
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock if (p->bitmap & ISNS_MGMT_REG) {
990b4856d0eaada6f8140335733a1b1771ed2746lling /* management scn are not bound */
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* by discovery domain service. */
fa9e4066f08beec538e775443c5be79dd423fcabahrens dd_id = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens dd_id = 0;
99653d4ee642c6528e88224f12409a5f23060994eschrock /* lock the cache for reading */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) cache_lock_read();
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* verify common dd */
fa9e4066f08beec538e775443c5be79dd423fcabahrens do {
fa9e4066f08beec538e775443c5be79dd423fcabahrens dd_id = get_common_dd(
99653d4ee642c6528e88224f12409a5f23060994eschrock p->uid,
fa9e4066f08beec538e775443c5be79dd423fcabahrens t->uid,
fa9e4066f08beec538e775443c5be79dd423fcabahrens dd_id);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } while (dd_id > 0 &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens is_dd_active(dd_id) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* unlock the cache */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) cache_unlock_nosync();
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock }
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock if (dd_id != 0) {
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock (void) scn_disp1(e, p, t);
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock }
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens p = p->next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens t = t->next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (text != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens t = text->next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* clean up the scn text(s) which nobody cares about. */
fa9e4066f08beec538e775443c5be79dd423fcabahrens free_scn_text(text);
fa9e4066f08beec538e775443c5be79dd423fcabahrens text = t;
99653d4ee642c6528e88224f12409a5f23060994eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (dd_id != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* scn(s) are dispatched. */
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_dispatched = 1;
99653d4ee642c6528e88224f12409a5f23060994eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * sf_gen:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * State transition function which generates and dispatches SCN(s).
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
99653d4ee642c6528e88224f12409a5f23060994eschrock * raw - the raw SCN data.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - always successful (0).
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrenssf_gen(
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_raw_t *raw
fa9e4066f08beec538e775443c5be79dd423fcabahrens)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t event;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_text_t *(*gen)(scn_raw_t *);
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_text_t *text = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm gen = scn_gen[raw->type];
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm if (gen != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens text = gen(raw);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens event = raw->event;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (text != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) scn_disp(event, text);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
24e697d414a4df0377b91a2875f029e7b5f97247ck/*
24e697d414a4df0377b91a2875f029e7b5f97247ck * ****************************************************************************
24e697d414a4df0377b91a2875f029e7b5f97247ck *
24e697d414a4df0377b91a2875f029e7b5f97247ck * sf_error:
24e697d414a4df0377b91a2875f029e7b5f97247ck * State transition function for an error state. It free any SCN(s)
24e697d414a4df0377b91a2875f029e7b5f97247ck * which have been generated and dispatched previously.
24e697d414a4df0377b91a2875f029e7b5f97247ck *
24e697d414a4df0377b91a2875f029e7b5f97247ck * raw - the raw SCN data.
24e697d414a4df0377b91a2875f029e7b5f97247ck * return - always successful (0).
24e697d414a4df0377b91a2875f029e7b5f97247ck *
24e697d414a4df0377b91a2875f029e7b5f97247ck * ****************************************************************************
24e697d414a4df0377b91a2875f029e7b5f97247ck */
24e697d414a4df0377b91a2875f029e7b5f97247ckstatic int
24e697d414a4df0377b91a2875f029e7b5f97247cksf_error(
24e697d414a4df0377b91a2875f029e7b5f97247ck /* LINTED E_FUNC_ARG_UNUSED */
24e697d414a4df0377b91a2875f029e7b5f97247ck scn_raw_t *raw
24e697d414a4df0377b91a2875f029e7b5f97247ck)
24e697d414a4df0377b91a2875f029e7b5f97247ck{
24e697d414a4df0377b91a2875f029e7b5f97247ck free_scn();
24e697d414a4df0377b91a2875f029e7b5f97247ck
24e697d414a4df0377b91a2875f029e7b5f97247ck return (0);
24e697d414a4df0377b91a2875f029e7b5f97247ck}
24e697d414a4df0377b91a2875f029e7b5f97247ck
24e697d414a4df0377b91a2875f029e7b5f97247ck/*
24e697d414a4df0377b91a2875f029e7b5f97247ck * ****************************************************************************
24e697d414a4df0377b91a2875f029e7b5f97247ck *
24e697d414a4df0377b91a2875f029e7b5f97247ck * scn_transition:
24e697d414a4df0377b91a2875f029e7b5f97247ck * Performs the state transition when a SCN event occurs.
24e697d414a4df0377b91a2875f029e7b5f97247ck *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * state - the previous state.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * raw - the raw SCN data.
99653d4ee642c6528e88224f12409a5f23060994eschrock * return - the next state.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
4c58d71403cebfaa40a572ff12b17668ebd56987darrenmscn_transition(
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm int state,
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm scn_raw_t *raw
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm)
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm{
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm uint32_t event = raw->event;
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm isns_type_t type = raw->type;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens int new_state = state;
99653d4ee642c6528e88224f12409a5f23060994eschrock
3bb79bece53191f2cf27aa61a72ea1784a7ce700eschrock const scn_tbl_t *tbl;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens tbl = &stbl[0];
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (;;) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((tbl->state == -1 || tbl->state == state) &&
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock (tbl->event == 0 || tbl->event == event) &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens (tbl->type == 0 || tbl->type == type)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (tbl->next_state != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens new_state = tbl->next_state;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (tbl->sf != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens tbl->sf(raw);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens tbl ++;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (new_state == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens isnslog(LOG_DEBUG, "scn_transition",
fa9e4066f08beec538e775443c5be79dd423fcabahrens "prev state: %d new event: 0x%x new object: %d.\n",
fa9e4066f08beec538e775443c5be79dd423fcabahrens state, event, type);
fa9e4066f08beec538e775443c5be79dd423fcabahrens new_state = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens state = new_state;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (state);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * connect_to:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Create socket connection with peer network portal.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * sz - the size of the ip addr.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * in - the ipv4 address.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * in6 - the ipv6 address.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * port2- the port info.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - the socket descriptor.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrensconnect_to(
fa9e4066f08beec538e775443c5be79dd423fcabahrens int sz,
fa9e4066f08beec538e775443c5be79dd423fcabahrens in_addr_t in,
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* LINTED E_FUNC_ARG_UNUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrens in6_addr_t *in6,
99653d4ee642c6528e88224f12409a5f23060994eschrock uint32_t port2
fa9e4066f08beec538e775443c5be79dd423fcabahrens)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock int so = -1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens union {
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct sockaddr sin;
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct sockaddr_in in;
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct sockaddr_in6 in6;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } ca = { 0 };
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens int tcp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint16_t port;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens tcp = (port2 & 0x10000) == 0 ? 1 : 0;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks port = (uint16_t)(port2 & 0xFFFF);
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock if (sz == sizeof (in_addr_t)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (tcp != 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock so = socket(AF_INET, SOCK_STREAM, 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (so != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ca.in.sin_family = AF_INET;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ca.in.sin_port = htons(port);
fa9e4066f08beec538e775443c5be79dd423fcabahrens ca.in.sin_addr.s_addr = in;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (connect(so, &ca.sin, sizeof (ca.in)) !=
fa9e4066f08beec538e775443c5be79dd423fcabahrens 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens isnslog(LOG_DEBUG, "connect_to",
fa9e4066f08beec538e775443c5be79dd423fcabahrens "connect() failed %%m.");
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) close(so);
fa9e4066f08beec538e775443c5be79dd423fcabahrens so = -1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens isnslog(LOG_DEBUG, "connect_to",
fa9e4066f08beec538e775443c5be79dd423fcabahrens "socket() failed %%m.");
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* FIXME: UDP support */
fa9e4066f08beec538e775443c5be79dd423fcabahrens isnslog(LOG_DEBUG, "connect_to", "No UDP support.");
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* FIXME: IPv6 support */
fa9e4066f08beec538e775443c5be79dd423fcabahrens isnslog(LOG_DEBUG, "connect_to", "No IPv6 support.");
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (so);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * emit_scn:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Emit the SCN to any portal of the peer storage node.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * list - the list of portal.
990b4856d0eaada6f8140335733a1b1771ed2746lling * pdu - the SCN packet.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * pl - the SCN packet payload length.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - always successful (0).
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensemit_scn(
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_list_t *list,
fa9e4066f08beec538e775443c5be79dd423fcabahrens isns_pdu_t *pdu,
fa9e4066f08beec538e775443c5be79dd423fcabahrens size_t pl
fa9e4066f08beec538e775443c5be79dd423fcabahrens)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int so = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_list_t *l;
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock scn_portal_t *p;
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens isns_pdu_t *rsp = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens size_t rsp_sz;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pdu->version = htons((uint16_t)ISNSP_VERSION);
fa9e4066f08beec538e775443c5be79dd423fcabahrens pdu->func_id = htons((uint16_t)ISNS_SCN);
fa9e4066f08beec538e775443c5be79dd423fcabahrens pdu->xid = htons(get_server_xid());
fa9e4066f08beec538e775443c5be79dd423fcabahrens
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock l = list;
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (l != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens p = l->data.portal;
fa9e4066f08beec538e775443c5be79dd423fcabahrens so = connect_to(p->sz, p->ip.in, p->ip.in6, p->port);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (so != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (isns_send_pdu(so, pdu, pl) == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* This may help Solaris iSCSI Initiator */
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* not to panic frequently. */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) isns_rcv_pdu(so, &rsp, &rsp_sz,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISNS_RCV_SHORT_TIMEOUT);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens isnslog(LOG_DEBUG, "emit_scn",
fa9e4066f08beec538e775443c5be79dd423fcabahrens "sending packet failed.");
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) close(so);
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* p->so = so; */
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens l = l->next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (rsp != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef DEBUG
fa9e4066f08beec538e775443c5be79dd423fcabahrens dump_pdu1(rsp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(rsp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * scn_trigger1:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Trigger one SCN for one SCN entry.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * t - the time that SCN is being triggered.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * p - the SCN entry.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - always successful (0).
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensscn_trigger1(
fa9e4066f08beec538e775443c5be79dd423fcabahrens time_t t,
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_registry_t *p
fa9e4066f08beec538e775443c5be79dd423fcabahrens)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ec;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens isns_pdu_t *pdu = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens size_t sz;
fa9e4066f08beec538e775443c5be79dd423fcabahrens size_t pl;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_t *s;
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_list_t *l;
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_text_t *x;
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock union {
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock uint32_t i32;
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock uint64_t i64;
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock } u;
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan#ifdef DEBUG
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan char buff[1024] = { 0 };
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan char *logbuff = buff;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan#endif
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan ec = pdu_reset_scn(&pdu, &pl, &sz);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (pdu == NULL) {
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan goto scn_done;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan }
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan /* add destination attribute */
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan ec = pdu_add_tlv(&pdu, &pl, &sz,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan ISNS_ISCSI_NAME_ATTR_ID,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan p->nlen,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan (void *)p->name, 0);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (ec != 0) {
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan goto scn_done;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan }
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan#ifdef DEBUG
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan sprintf(logbuff, "==>%s ", p->name);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan logbuff += strlen(logbuff);
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock /* add timestamp */
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock u.i64 = BE_64((uint64_t)t);
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock ec = pdu_add_tlv(&pdu, &pl, &sz,
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock ISNS_TIMESTAMP_ATTR_ID,
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock 8,
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock (void *)&u.i64, 1);
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock s = p->scn;
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock while (s != NULL && ec == 0) {
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock u.i32 = htonl(s->event);
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock ec = pdu_add_tlv(&pdu, &pl, &sz,
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock ISNS_ISCSI_SCN_BITMAP_ATTR_ID,
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock 4,
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock (void *)&u.i32, 1);
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock#ifdef DEBUG
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock sprintf(logbuff, "EVENT [%d] ", s->event);
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock logbuff += strlen(logbuff);
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens l = s->data.list;
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (l != NULL && ec == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens x = l->data.text;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (x->flag == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ec = pdu_add_tlv(&pdu, &pl, &sz,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISNS_ISCSI_NAME_ATTR_ID,
fa9e4066f08beec538e775443c5be79dd423fcabahrens x->ilen, (void *)x->iscsi, 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef DEBUG
fa9e4066f08beec538e775443c5be79dd423fcabahrens sprintf(logbuff, "FROM [%s] ", x->iscsi);
fa9e4066f08beec538e775443c5be79dd423fcabahrens logbuff += strlen(logbuff);
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (ec == 0 &&
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock (p->bitmap &
fa9e4066f08beec538e775443c5be79dd423fcabahrens (ISNS_MEMBER_ADDED |
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISNS_MEMBER_REMOVED))) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* management SCN */
fa9e4066f08beec538e775443c5be79dd423fcabahrens u.i32 = htonl(x->dd_id);
fa9e4066f08beec538e775443c5be79dd423fcabahrens ec = pdu_add_tlv(&pdu, &pl, &sz,
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock ISNS_DD_ID_ATTR_ID,
fa9e4066f08beec538e775443c5be79dd423fcabahrens 4, (void *)&u.i32, 1);
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock#ifdef DEBUG
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock sprintf(logbuff, "IN DD [%d] ",
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock x->dd_id);
fa9e4066f08beec538e775443c5be79dd423fcabahrens logbuff += strlen(logbuff);
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock /* add(remove) dd to(from) dd-set */
fa9e4066f08beec538e775443c5be79dd423fcabahrens u.i32 = htonl(x->dd_id);
fa9e4066f08beec538e775443c5be79dd423fcabahrens ec = pdu_add_tlv(&pdu, &pl, &sz,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISNS_DD_ID_ATTR_ID,
fa9e4066f08beec538e775443c5be79dd423fcabahrens 4, (void *)&u.i32, 1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens u.i32 = htonl(x->dds_id);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (ec == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ec = pdu_add_tlv(&pdu, &pl, &sz,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISNS_DD_ID_ATTR_ID,
fa9e4066f08beec538e775443c5be79dd423fcabahrens 4, (void *)&u.i32, 1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef DEBUG
fa9e4066f08beec538e775443c5be79dd423fcabahrens sprintf(logbuff, "FROM [%d] ", x->dd_id);
fa9e4066f08beec538e775443c5be79dd423fcabahrens logbuff += strlen(logbuff);
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock sprintf(logbuff, "IN [%d] ", x->dds_id);
fa9e4066f08beec538e775443c5be79dd423fcabahrens logbuff += strlen(logbuff);
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens l = l->next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock s = s->next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensscn_done:
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (ec == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef DEBUG
fa9e4066f08beec538e775443c5be79dd423fcabahrens isnslog(LOG_DEBUG, "scn_trigger1", buff);
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens ec = emit_scn(p->portal.l, pdu, pl);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens isnslog(LOG_DEBUG, "scn_trigger1", " failed.\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(pdu);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * scn_trigger:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Trigger one SCN for every SCN entry.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - always successful (0).
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensscn_trigger(
fa9e4066f08beec538e775443c5be79dd423fcabahrens)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens time_t t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_registry_t *p;
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens t = time(NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens p = scn_registry;
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (p != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (p->scn != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) scn_trigger1(t, p);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens p = p->next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * global functions.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * scn_list_load:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Load one SCN entry and add it to the SCN entry list.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * uid - the Storage Node object UID.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * node - the Storage Node name.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * nlen - the length of the name.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * bitmap - the SCN bitmap.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - error code.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
99653d4ee642c6528e88224f12409a5f23060994eschrockint
fa9e4066f08beec538e775443c5be79dd423fcabahrensscn_list_load(
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t uid,
fa9e4066f08beec538e775443c5be79dd423fcabahrens uchar_t *node,
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t nlen,
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t bitmap
fa9e4066f08beec538e775443c5be79dd423fcabahrens)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ec = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_registry_t *list;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uchar_t *name;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens list = (scn_registry_t *)malloc(sizeof (scn_registry_t));
fa9e4066f08beec538e775443c5be79dd423fcabahrens name = (uchar_t *)malloc(nlen);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (list != NULL && name != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens list->uid = uid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strcpy((char *)name, (char *)node);
fa9e4066f08beec538e775443c5be79dd423fcabahrens list->name = name;
fa9e4066f08beec538e775443c5be79dd423fcabahrens list->nlen = nlen;
fa9e4066f08beec538e775443c5be79dd423fcabahrens list->bitmap = bitmap;
fa9e4066f08beec538e775443c5be79dd423fcabahrens list->portal.l = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens list->scn = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens list->next = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ASSERT(scn_q == NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) scn_list_add(list);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(list);
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens ec = ISNS_RSP_INTERNAL_ERROR;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ec);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * verify_scn_portal:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Extract and verify portals for every SCN entry(s) after they are
fa9e4066f08beec538e775443c5be79dd423fcabahrens * loaded from data store, for those which do not have a SCN portal,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * remove it from the SCN entry list.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - 1: error occurs, otherwise 0.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
b1b8ab34de515a5e83206da22c3d7e563241b021llingint
fa9e4066f08beec538e775443c5be79dd423fcabahrensverify_scn_portal(
fa9e4066f08beec538e775443c5be79dd423fcabahrens)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock scn_registry_t **pp, *e;
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_portal_t *p;
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens pp = &scn_registry;
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (*pp != NULL) {
99653d4ee642c6528e88224f12409a5f23060994eschrock e = *pp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens p = extract_scn_portal(e->name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (p != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (scn_add_portal(e, p) != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (e->portal.l != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens pp = &e->next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* remove this entry */
fa9e4066f08beec538e775443c5be79dd423fcabahrens *pp = e->next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens free_entry(e);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* free the unused portal(s) */
fa9e4066f08beec538e775443c5be79dd423fcabahrens free_portal(p);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock}
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock/*
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * ****************************************************************************
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock *
99653d4ee642c6528e88224f12409a5f23060994eschrock * add_scn_entry:
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * Add a SCN entry.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * node - the Storage Node name.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * nlen - the length of the name.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * bitmap - the SCN bitmap.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - error code.
99653d4ee642c6528e88224f12409a5f23060994eschrock *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrensadd_scn_entry(
fa9e4066f08beec538e775443c5be79dd423fcabahrens uchar_t *node,
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t nlen,
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t bitmap
99653d4ee642c6528e88224f12409a5f23060994eschrock)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ec = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t mgmt;
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_portal_t *p;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens lookup_ctrl_t lc;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t uid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_registry_t *e;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uchar_t *name;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock mgmt = bitmap & (
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock ISNS_MGMT_REG |
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock ISNS_MEMBER_REMOVED |
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock ISNS_MEMBER_ADDED);
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock if ((mgmt > 0 &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens (mgmt_scn == 0 ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens mgmt < ISNS_MGMT_REG ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens is_control_node(node) == 0)) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens (p = extract_scn_portal(node)) == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ISNS_RSP_SCN_REGIS_REJECTED);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens e = (scn_registry_t *)malloc(sizeof (scn_registry_t));
fa9e4066f08beec538e775443c5be79dd423fcabahrens name = (uchar_t *)malloc(nlen);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (e != NULL && name != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens lc.type = OBJ_ISCSI;
fa9e4066f08beec538e775443c5be79dd423fcabahrens lc.curr_uid = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens lc.id[0] = ATTR_INDEX_ISCSI(ISNS_ISCSI_NAME_ATTR_ID);
fa9e4066f08beec538e775443c5be79dd423fcabahrens lc.data[0].ptr = node;
fa9e4066f08beec538e775443c5be79dd423fcabahrens lc.op[0] = OP_STRING;
99653d4ee642c6528e88224f12409a5f23060994eschrock lc.op[1] = 0;
99653d4ee642c6528e88224f12409a5f23060994eschrock lc.data[2].ui = bitmap;
990b4856d0eaada6f8140335733a1b1771ed2746lling ec = cache_lookup(&lc, &uid, cb_update_scn_bitmap);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (uid == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ec = ISNS_RSP_SCN_REGIS_REJECTED;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (ec == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens e->uid = uid;
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) strcpy((char *)name, (char *)node);
990b4856d0eaada6f8140335733a1b1771ed2746lling e->name = name;
fa9e4066f08beec538e775443c5be79dd423fcabahrens e->nlen = nlen;
990b4856d0eaada6f8140335733a1b1771ed2746lling e->bitmap = bitmap;
990b4856d0eaada6f8140335733a1b1771ed2746lling e->portal.p = p;
990b4856d0eaada6f8140335733a1b1771ed2746lling e->scn = NULL;
990b4856d0eaada6f8140335733a1b1771ed2746lling e->next = NULL;
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) queue_msg_set(scn_q, SCN_ADD, (void *)e);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ec = ISNS_RSP_INTERNAL_ERROR;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (ec != 0) {
990b4856d0eaada6f8140335733a1b1771ed2746lling free(e);
990b4856d0eaada6f8140335733a1b1771ed2746lling free(name);
990b4856d0eaada6f8140335733a1b1771ed2746lling free_portal(p);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling return (ec);
990b4856d0eaada6f8140335733a1b1771ed2746lling}
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling/*
990b4856d0eaada6f8140335733a1b1771ed2746lling * ****************************************************************************
990b4856d0eaada6f8140335733a1b1771ed2746lling *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * remove_scn_entry:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Remove a SCN entry.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * node - the Storage Node name.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - error code.
990b4856d0eaada6f8140335733a1b1771ed2746lling *
990b4856d0eaada6f8140335733a1b1771ed2746lling * ****************************************************************************
990b4856d0eaada6f8140335733a1b1771ed2746lling */
990b4856d0eaada6f8140335733a1b1771ed2746llingint
990b4856d0eaada6f8140335733a1b1771ed2746llingremove_scn_entry(
990b4856d0eaada6f8140335733a1b1771ed2746lling uchar_t *node
fa9e4066f08beec538e775443c5be79dd423fcabahrens)
990b4856d0eaada6f8140335733a1b1771ed2746lling{
990b4856d0eaada6f8140335733a1b1771ed2746lling int ec = 0;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling lookup_ctrl_t lc;
990b4856d0eaada6f8140335733a1b1771ed2746lling uint32_t uid;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling lc.type = OBJ_ISCSI;
990b4856d0eaada6f8140335733a1b1771ed2746lling lc.curr_uid = 0;
990b4856d0eaada6f8140335733a1b1771ed2746lling lc.id[0] = ATTR_INDEX_ISCSI(ISNS_ISCSI_NAME_ATTR_ID);
fa9e4066f08beec538e775443c5be79dd423fcabahrens lc.data[0].ptr = node;
fa9e4066f08beec538e775443c5be79dd423fcabahrens lc.op[0] = OP_STRING;
fa9e4066f08beec538e775443c5be79dd423fcabahrens lc.op[1] = 0;
990b4856d0eaada6f8140335733a1b1771ed2746lling lc.data[2].ui = 0;
990b4856d0eaada6f8140335733a1b1771ed2746lling ec = cache_lookup(&lc, &uid, cb_update_scn_bitmap);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (ec == 0 && uid != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) queue_msg_set(scn_q, SCN_REMOVE, (void *)uid);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling return (ec);
990b4856d0eaada6f8140335733a1b1771ed2746lling}
990b4856d0eaada6f8140335733a1b1771ed2746lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
990b4856d0eaada6f8140335733a1b1771ed2746lling * ****************************************************************************
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
990b4856d0eaada6f8140335733a1b1771ed2746lling * remove_scn_portal:
990b4856d0eaada6f8140335733a1b1771ed2746lling * Remove a portal from every SCN entry.
990b4856d0eaada6f8140335733a1b1771ed2746lling *
990b4856d0eaada6f8140335733a1b1771ed2746lling * uid - the Portal object UID.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * return - alrays successful (0).
990b4856d0eaada6f8140335733a1b1771ed2746lling *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
990b4856d0eaada6f8140335733a1b1771ed2746lling */
990b4856d0eaada6f8140335733a1b1771ed2746llingint
990b4856d0eaada6f8140335733a1b1771ed2746llingremove_scn_portal(
990b4856d0eaada6f8140335733a1b1771ed2746lling uint32_t uid
990b4856d0eaada6f8140335733a1b1771ed2746lling)
990b4856d0eaada6f8140335733a1b1771ed2746lling{
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) queue_msg_set(scn_q, SCN_REMOVE_P, (void *)uid);
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling return (0);
990b4856d0eaada6f8140335733a1b1771ed2746lling}
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ****************************************************************************
990b4856d0eaada6f8140335733a1b1771ed2746lling *
990b4856d0eaada6f8140335733a1b1771ed2746lling * scn_proc:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The entry point of the SCN thread. It listens on the SCN message
990b4856d0eaada6f8140335733a1b1771ed2746lling * queue and process every SCN related stuff.
990b4856d0eaada6f8140335733a1b1771ed2746lling *
990b4856d0eaada6f8140335733a1b1771ed2746lling * arg - nothing.
990b4856d0eaada6f8140335733a1b1771ed2746lling * return - NULL.
990b4856d0eaada6f8140335733a1b1771ed2746lling *
990b4856d0eaada6f8140335733a1b1771ed2746lling * ****************************************************************************
990b4856d0eaada6f8140335733a1b1771ed2746lling */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid *
990b4856d0eaada6f8140335733a1b1771ed2746llingscn_proc(
990b4856d0eaada6f8140335733a1b1771ed2746lling /* LINTED E_FUNC_ARG_UNUSED */
990b4856d0eaada6f8140335733a1b1771ed2746lling void *arg
990b4856d0eaada6f8140335733a1b1771ed2746lling)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int state = 0;
990b4856d0eaada6f8140335733a1b1771ed2746lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_raw_t *raw;
fa9e4066f08beec538e775443c5be79dd423fcabahrens msg_text_t *msg;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (;;) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens msg = queue_msg_get(scn_q);
990b4856d0eaada6f8140335733a1b1771ed2746lling switch (msg->id) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case SCN_ADD:
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) scn_list_add((scn_registry_t *)msg->data);
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
990b4856d0eaada6f8140335733a1b1771ed2746lling case SCN_REMOVE:
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) scn_list_remove((uint32_t)msg->data);
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case SCN_REMOVE_P:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) scn_remove_portal((uint32_t)msg->data);
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case SCN_SET:
fa9e4066f08beec538e775443c5be79dd423fcabahrens raw = (scn_raw_t *)msg->data;
fa9e4066f08beec538e775443c5be79dd423fcabahrens state = scn_transition(state, raw);
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* free the raw data */
fa9e4066f08beec538e775443c5be79dd423fcabahrens free_raw(raw);
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
990b4856d0eaada6f8140335733a1b1771ed2746lling case SCN_TRIGGER:
990b4856d0eaada6f8140335733a1b1771ed2746lling if (scn_dispatched != 0) {
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) scn_trigger();
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens case SCN_IGNORE:
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* clean the scn(s) */
fa9e4066f08beec538e775443c5be79dd423fcabahrens free_scn();
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* reset the state */
99653d4ee642c6528e88224f12409a5f23060994eschrock state = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* reset the scn_dispatched flag */
fa9e4066f08beec538e775443c5be79dd423fcabahrens scn_dispatched = 0;
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case SCN_STOP:
fa9e4066f08beec538e775443c5be79dd423fcabahrens queue_msg_free(msg);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens default:
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens queue_msg_free(msg);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
99653d4ee642c6528e88224f12409a5f23060994eschrock