summaryrefslogtreecommitdiff
path: root/utils/open-isns/portal-group.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/open-isns/portal-group.c')
-rw-r--r--utils/open-isns/portal-group.c307
1 files changed, 0 insertions, 307 deletions
diff --git a/utils/open-isns/portal-group.c b/utils/open-isns/portal-group.c
deleted file mode 100644
index 647bbde..0000000
--- a/utils/open-isns/portal-group.c
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- * iSNS object model - portal group specific code
- *
- * Copyright (C) 2007 Olaf Kirch <olaf.kirch@oracle.com>
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include "isns.h"
-#include "objects.h"
-#include "vendor.h"
-#include "attrs.h"
-#include "util.h"
-
-/* For relationship stuff - should go */
-#include "db.h"
-
-
-/*
- * Retrieve attribute @old_tag from object @obj, create a copy with
- * tag @new_tag, and append it to list @dst.
- * (Helper function for the portal group stuff)
- */
-static int
-__isns_object_translate_attr(isns_object_t *obj,
- uint32_t old_tag, uint32_t new_tag,
- isns_attr_list_t *dst)
-{
- isns_value_t value;
-
- if (!isns_attr_list_get_value(&obj->ie_attrs, old_tag, &value))
- return 0;
- isns_attr_list_append_value(dst, new_tag, NULL, &value);
- return 1;
-}
-
-
-/*
- * Portal Group
- */
-static isns_object_t *
-__isns_pg_create(const isns_attr_list_t *attrs, uint32_t pg_tag,
- isns_object_t *portal, isns_object_t *node)
-{
- isns_object_t *obj;
-
- obj = isns_create_object(&isns_iscsi_pg_template, attrs,
- isns_object_get_entity(portal));
-
- /*
- * 3.4
- *
- * Each Portal and iSCSI Storage Node registered in an Entity can
- * be associated using a Portal Group (PG) object. The PG Tag
- * (PGT), if non-NULL, indicates that the associated Portal
- * provides access to the associated iSCSI Storage Node in
- * the Entity. All Portals that have the same PGT value for
- * a specific iSCSI Storage Node allow coordinated access to
- * that node.
- *
- * 5.6.5.2
- *
- * If the PGT of the Portal Group is not NULL, then a relationship
- * exists between the indicated Storage Node and Portal; if the
- * PGT is NULL, then no relationship exists.
- */
- if (pg_tag != 0) {
- isns_object_set_uint32(obj,
- ISNS_TAG_PG_TAG, pg_tag);
- } else {
- /* A NULL PGT indicates that the
- * storage node cannot be accessed through
- * this portal. */
- isns_object_set_nil(obj, ISNS_TAG_PG_TAG);
- }
-
- /* This object represents a relationship between portal
- and storage node. Create a relation. */
- obj->ie_relation = isns_create_relation(obj,
- ISNS_RELATION_PORTAL_GROUP,
- portal, node);
-
- return obj;
-}
-
-/*
- * Find the portal for a given portal group
- */
-static isns_object_t *
-__isns_pg_find_portal(isns_db_t *db, isns_object_t *pg,
- const isns_object_list_t *extra_objs)
-{
- isns_attr_list_t key_attrs = ISNS_ATTR_LIST_INIT;
- isns_object_t *obj = NULL;
-
- /* FIXME: ISNS_TAG_PG_PORTAL_IP_ADDR -> ...ADDRESS */
- if (!__isns_object_translate_attr(pg,
- ISNS_TAG_PG_PORTAL_IP_ADDR,
- ISNS_TAG_PORTAL_IP_ADDRESS,
- &key_attrs))
- goto out;
- if (!__isns_object_translate_attr(pg,
- ISNS_TAG_PG_PORTAL_TCP_UDP_PORT,
- ISNS_TAG_PORTAL_TCP_UDP_PORT,
- &key_attrs))
- goto out;
-
- obj = isns_db_lookup(db, &isns_portal_template, &key_attrs);
- if (!obj && extra_objs)
- obj = isns_object_list_lookup(extra_objs,
- &isns_portal_template, &key_attrs);
-
-out:
- isns_attr_list_destroy(&key_attrs);
- return obj;
-}
-
-/*
- * Find the node for a given portal group
- */
-static isns_object_t *
-__isns_pg_find_node(isns_db_t *db, isns_object_t *pg,
- const isns_object_list_t *extra_objs)
-{
- isns_attr_list_t key_attrs = ISNS_ATTR_LIST_INIT;
- isns_object_t *obj = NULL;
-
- if (!__isns_object_translate_attr(pg,
- ISNS_TAG_PG_ISCSI_NAME,
- ISNS_TAG_ISCSI_NAME,
- &key_attrs))
- goto out;
-
- obj = isns_db_lookup(db, &isns_iscsi_node_template, &key_attrs);
- if (!obj && extra_objs)
- obj = isns_object_list_lookup(extra_objs,
- &isns_iscsi_node_template, &key_attrs);
-
-out:
- isns_attr_list_destroy(&key_attrs);
- return obj;
-}
-
-/*
- * When creating a portal group, it must not connect nodes and
- * portals from other entities. However, it is perfectly fine to
- * link objects in limbo.
- */
-static inline int
-__isns_pg_may_relate(isns_object_t *entity, isns_object_t *subordinate)
-{
- isns_object_t *other;
-
- other = isns_object_get_entity(subordinate);
- return other == NULL || other == entity;
-}
-
-/*
- * Given a portal group object, create the relationship
- */
-isns_relation_t *
-isns_db_build_pg_relation(isns_db_t *db, isns_object_t *pg,
- const isns_object_list_t *extra_objs)
-{
- isns_object_t *entity, *node = NULL, *portal = NULL;
-
- entity = isns_object_get_entity(pg);
-
- node = __isns_pg_find_node(db, pg, extra_objs);
- if (node == NULL) {
- isns_error("Trying to register PG for non-existant node\n");
- goto failed;
- }
- if (!__isns_pg_may_relate(entity, node)) {
- isns_error("Trying to register PG for node in other entity\n");
- goto failed;
- }
-
- portal = __isns_pg_find_portal(db, pg, extra_objs);
- if (portal == NULL) {
- isns_error("Trying to register PG for non-existant portal\n");
- goto failed;
- }
- if (!__isns_pg_may_relate(entity, portal)) {
- isns_error("Trying to register PG for portal in other entity\n");
- goto failed;
- }
-
- pg->ie_relation = isns_create_relation(pg,
- ISNS_RELATION_PORTAL_GROUP,
- node, portal);
- isns_object_release(portal);
- isns_object_release(node);
-
- return pg->ie_relation;
-
-failed:
- if (portal)
- isns_object_release(portal);
- if (node)
- isns_object_release(node);
- return NULL;
-}
-
-/*
- * Create a portal group given node, portal and PGT
- */
-isns_object_t *
-isns_create_portal_group(isns_object_t *portal,
- isns_object_t *node, uint32_t pg_tag)
-{
- isns_attr_list_t key_attrs = ISNS_ATTR_LIST_INIT;
- isns_object_t *obj = NULL;
-
- if (portal == NULL || node == NULL)
- return NULL;
-
- if (node->ie_container != portal->ie_container) {
- isns_error("Refusing to create portal group "
- "linking objects from different entities\n");
- return NULL;
- }
-
- if (__isns_object_translate_attr(node,
- ISNS_TAG_ISCSI_NAME,
- ISNS_TAG_PG_ISCSI_NAME,
- &key_attrs)
- && __isns_object_translate_attr(portal,
- ISNS_TAG_PORTAL_IP_ADDRESS,
- ISNS_TAG_PG_PORTAL_IP_ADDR,
- &key_attrs)
- && __isns_object_translate_attr(portal,
- ISNS_TAG_PORTAL_TCP_UDP_PORT,
- ISNS_TAG_PG_PORTAL_TCP_UDP_PORT,
- &key_attrs)) {
- obj = __isns_pg_create(&key_attrs, pg_tag, portal, node);
- }
-
- isns_attr_list_destroy(&key_attrs);
- return obj;
-}
-
-/*
- * 5.6.5.1
- * New PG objects are registered when an associated Portal or
- * iSCSI Node object is registered. An explicit PG object
- * registration MAY follow a Portal or iSCSI Node object
- * registration in a DevAttrReg message.
- * [...]
- * If the PGT value is not included in the Storage Node or
- * Portal object registration, and if a PGT value was not
- * previously registered for the relationship, then the PGT for
- * the corresponding PG object SHALL be registered with a value
- * of 0x00000001.
- *
- * We return non-NULL if the object was created.
- */
-isns_object_t *
-isns_create_default_portal_group(isns_db_t *db,
- isns_object_t *portal, isns_object_t *node)
-{
- isns_object_t *obj;
-
- if (portal == NULL || node == NULL)
- return 0;
-
- /* See if there is a PG already */
- obj = isns_db_get_relationship_object(db, node, portal,
- ISNS_RELATION_PORTAL_GROUP);
- if (obj != NULL) {
- isns_object_release(obj);
- return NULL;
- }
-
- return isns_create_portal_group(portal, node, 1);
-}
-
-static uint32_t iscsi_pg_attrs[] = {
- ISNS_TAG_PG_ISCSI_NAME,
- ISNS_TAG_PG_PORTAL_IP_ADDR,
- ISNS_TAG_PG_PORTAL_TCP_UDP_PORT,
- ISNS_TAG_PG_TAG,
- ISNS_TAG_PG_INDEX,
-};
-
-static uint32_t iscsi_pg_key_attrs[] = {
- ISNS_TAG_PG_ISCSI_NAME,
- ISNS_TAG_PG_PORTAL_IP_ADDR,
- ISNS_TAG_PG_PORTAL_TCP_UDP_PORT,
-};
-
-isns_object_template_t isns_iscsi_pg_template = {
- .iot_name = "iSCSI Portal Group",
- .iot_handle = ISNS_OBJECT_TYPE_PG,
- .iot_attrs = iscsi_pg_attrs,
- .iot_num_attrs = array_num_elements(iscsi_pg_attrs),
- .iot_keys = iscsi_pg_key_attrs,
- .iot_num_keys = array_num_elements(iscsi_pg_key_attrs),
- .iot_attrs = iscsi_pg_attrs,
- .iot_keys = iscsi_pg_key_attrs,
- .iot_index = ISNS_TAG_PG_INDEX,
- .iot_next_index = ISNS_TAG_PG_NEXT_INDEX,
- .iot_container = &isns_entity_template,
- .iot_relation_type = ISNS_RELATION_PORTAL_GROUP,
- .iot_build_relation = isns_db_build_pg_relation,
-};
-