/* * Create a registration, and set the source name */ static isns_simple_t * __isns_create_deregistration(isns_source_t *source, const isns_attr_list_t *attrs) { isns_simple_t *simp; simp = isns_simple_create(ISNS_DEVICE_DEREGISTER, source, NULL); if (simp && attrs) isns_attr_list_copy(&simp->is_operating_attrs, attrs); return simp; }
/* * Create an SCN */ isns_simple_t * isns_create_scn(isns_source_t *source, isns_attr_t *nodeattr, isns_attr_t *tsattr) { isns_simple_t *call; call = isns_simple_create(ISNS_STATE_CHANGE_NOTIFICATION, source, NULL); if (call && nodeattr) isns_attr_list_append_attr(&call->is_message_attrs, nodeattr); if (call && tsattr) isns_attr_list_append_attr(&call->is_message_attrs, tsattr); return call; }
/* * Create a registration, and set the source name */ static isns_simple_t * __isns_create_registration(isns_source_t *source, isns_object_t *key_obj) { isns_simple_t *reg; reg = isns_simple_create(ISNS_DEVICE_ATTRIBUTE_REGISTER, source, NULL); if (reg == NULL) return NULL; /* * When sending a registration, you can either specify * the object to be modified in the key attrs, or leave * the key empty. */ if (key_obj == NULL) return reg; /* User gave us a key object. We need to put the key * attributes into the message attrs, and *all* attrs * into the operating attrs. */ if (!isns_object_extract_keys(key_obj, ®->is_message_attrs)) { /* bummer - seems the object is missing some * vital organs. */ isns_warning("%s: object not fully specified, key attrs missing\n", __FUNCTION__); goto failed; } /* * The Message Key identifies the object the DevAttrReg message * acts upon. [...] The key attribute(s) identifying this object * MUST also be included among the Operating Attributes. * * We do not enforce this here, we rely on the caller to get this * right. */ #if 0 if (!isns_object_extract_all(key_obj, ®->is_operating_attrs)) { isns_warning("%s: unable to extract attrs from key objects\n", __FUNCTION__); goto failed; } #endif return reg; failed: isns_simple_free(reg); return NULL; }
/* * Support for SCNRegister calls */ isns_simple_t * isns_create_scn_registration2(isns_client_t *clnt, unsigned int bitmap, isns_source_t *source) { isns_simple_t *call; if (!source) source = clnt->ic_source; call = isns_simple_create(ISNS_SCN_REGISTER, source, NULL); if (call) { isns_attr_list_append_attr(&call->is_message_attrs, isns_source_attr(source)); isns_attr_list_append_uint32(&call->is_operating_attrs, ISNS_TAG_ISCSI_SCN_BITMAP, bitmap); } return call; }
int main(int argc, char **argv) { const char *opt_configfile = ISNS_DEFAULT_ISNSADM_CONFIG; isns_client_t *clnt; isns_attr_list_t *attrs; isns_simple_t *reg; isns_portal_info_t portal_info; uint32_t status; int opt_replace = 1; int c, n, timeout; while ((c = getopt(argc, argv, "c:d:n")) != -1) { switch (c) { case 'c': opt_configfile = optarg; break; case 'd': isns_enable_debugging(optarg); break; case 'n': opt_replace = 0; break; default: isns_fatal("Unknown option\n"); } } if (optind != argc - 1) isns_fatal("Need timeout argument\n"); timeout = parse_timeout(argv[optind]); isns_read_config(opt_configfile); /* ---DevAttrReg[REPLACE]--- Source: 0020 string : iSCSI name = "iqn.2005-03.org.open-iscsi:blue" Message attributes: 0001 string : Entity identifier = "blue.pauw.homeunix.net" Operating attributes: 0001 string : Entity identifier = "blue.pauw.homeunix.net" 0002 uint32 : Entity protocol = iSCSI (2) 0010 ipaddr : Portal IP address = 192.168.1.2 0011 uint32 : Portal TCP/UDP port = 33849/tcp 0014 uint32 : ESI port = 56288/tcp 0020 string : iSCSI name = "iqn.2005-03.org.open-iscsi:blue" 0021 uint32 : iSCSI node type = Initiator 0022 string : iSCSI alias = "blue.pauw.homeunix.net" [...] response status 0x0003 (Invalid registration) This would fail because we got confused about EID in the replace case. */ isns_assign_string(&isns_config.ic_source_name, "iqn.2005-03.org.open-iscsi:blue"); for (n = 0; n < 2; ++n) { clnt = isns_create_default_client(NULL); reg = isns_simple_create(ISNS_DEVICE_ATTRIBUTE_REGISTER, clnt->ic_source, NULL); reg->is_replace = opt_replace; /* Message attributes */ attrs = ®->is_message_attrs; STR(ENTITY_IDENTIFIER, "blue.pauw.homeunix.net"); /* Operating attributes */ attrs = ®->is_operating_attrs; STR(ENTITY_IDENTIFIER, "blue.pauw.homeunix.net"); U32(ENTITY_PROTOCOL, 2); isns_portal_parse(&portal_info, "192.168.1.2:33849/tcp", NULL); isns_portal_to_attr_list(&portal_info, ISNS_TAG_PORTAL_IP_ADDRESS, ISNS_TAG_PORTAL_TCP_UDP_PORT, attrs); U32(ESI_PORT, 56288); STR(ISCSI_NAME, "iqn.2005-03.org.open-iscsi:blue"); U32(ISCSI_NODE_TYPE, ISNS_ISCSI_INITIATOR_MASK); STR(ISCSI_ALIAS, "blue.pauw.homeunix.net"); isns_simple_print(reg, isns_print_stdout); status = isns_client_call(clnt, ®); if (status != ISNS_SUCCESS) isns_fatal("Unable to register object: %s\n", isns_strerror(status)); printf("Successfully registered object\n"); // isns_simple_print(reg, isns_print_stdout); isns_simple_free(reg); isns_client_destroy(clnt); if (n == 0) { printf("Sleeping for %d seconds\n", timeout); sleep(timeout); } } return 0; }
int main(int argc, char **argv) { const char *opt_configfile = ISNS_DEFAULT_ISNSADM_CONFIG; isns_client_t *clnt; isns_attr_list_t *attrs; isns_simple_t *reg; isns_portal_info_t portal_info; uint32_t status; int opt_replace = 1; int c; while ((c = getopt(argc, argv, "c:d:n")) != -1) { switch (c) { case 'c': opt_configfile = optarg; break; case 'd': isns_enable_debugging(optarg); break; case 'n': opt_replace = 0; break; default: isns_fatal("Unknown option\n"); } } isns_read_config(opt_configfile); isns_assign_string(&isns_config.ic_source_name, "iqn.1991-05.com.microsoft:orange"); clnt = isns_create_default_client(NULL); /* * test that we can deregister for SCN events, even though * not registered */ reg = isns_simple_create(ISNS_SCN_DEREGISTER, clnt->ic_source, NULL); /* Message attributes */ attrs = ®->is_message_attrs; STR(ISCSI_NAME, "iqn.1991-05.com.microsoft:orange"); status = isns_client_call(clnt, ®); if (status != ISNS_SUCCESS) isns_error("SCNDereg failed: %s\n", isns_strerror(status)); else printf("Successfully deregistered for SCN events\n"); isns_simple_free(reg); /* * test that we can deregister a device, even though not * registered -- note that the portal group object proceeds * the initiator (name) object in the operating attribute * list */ reg = isns_simple_create(ISNS_DEVICE_DEREGISTER, clnt->ic_source, NULL); attrs = ®->is_operating_attrs; STR(ENTITY_IDENTIFIER, "troopa.nki.nl"); U32(ENTITY_PROTOCOL, 2); isns_portal_parse(&portal_info, "192.168.1.40:3229/tcp", NULL); isns_portal_to_attr_list(&portal_info, ISNS_TAG_PORTAL_IP_ADDRESS, ISNS_TAG_PORTAL_TCP_UDP_PORT, attrs); STR(ISCSI_NAME, "iqn.1991-05.com.microsoft:orange"); status = isns_client_call(clnt, ®); if (status != ISNS_SUCCESS) isns_fatal("DevDereg failed: %s\n", isns_strerror(status)); else printf("Successfully deregistered a device\n"); isns_simple_free(reg); /* * test that we can register (w/replace) device attributes */ reg = isns_simple_create(ISNS_DEVICE_ATTRIBUTE_REGISTER, clnt->ic_source, NULL); reg->is_replace = opt_replace; attrs = ®->is_operating_attrs; STR(ENTITY_IDENTIFIER, "troopa.nki.nl"); U32(ENTITY_PROTOCOL, 2); isns_portal_parse(&portal_info, "192.168.1.40:3229/tcp", NULL); isns_portal_to_attr_list(&portal_info, ISNS_TAG_PORTAL_IP_ADDRESS, ISNS_TAG_PORTAL_TCP_UDP_PORT, attrs); U32(SCN_PORT, 3230); U32(ESI_PORT, 3230); U32(PG_TAG, 1); STR(PG_ISCSI_NAME, "iqn.1991-05.com.microsoft:orange"); STR(ISCSI_NAME, "iqn.1991-05.com.microsoft:orange"); U32(ISCSI_NODE_TYPE, ISNS_ISCSI_INITIATOR_MASK); STR(ISCSI_ALIAS, "<MS SW iSCSI Initiator>"); status = isns_client_call(clnt, ®); if (status != ISNS_SUCCESS) isns_fatal("DevAttrReg failed: %s\n", isns_strerror(status)); else printf("Successfully registered device attributes\n"); isns_simple_free(reg); /* * test that we can call DEVICE GET NEXT to get the next (only) * iscsi Storage Node */ reg = isns_simple_create(ISNS_DEVICE_GET_NEXT, clnt->ic_source, NULL); attrs = ®->is_message_attrs; NIL(ISCSI_NAME); attrs = ®->is_operating_attrs; U32(ISCSI_NODE_TYPE, ISNS_ISCSI_INITIATOR_MASK); NIL(ISCSI_NODE_TYPE); status = isns_client_call(clnt, ®); if (status != ISNS_SUCCESS) isns_fatal("DevGetNext failed: %s\n", isns_strerror(status)); else printf("Successfully got next device node\n"); isns_simple_free(reg); return 0; }
int main(int argc, char **argv) { const char *opt_configfile = ISNS_DEFAULT_ISNSADM_CONFIG; isns_client_t *clnt; isns_attr_list_t *attrs; isns_simple_t *reg; isns_portal_info_t portal_info; uint32_t status; int opt_replace = 1; int c; while ((c = getopt(argc, argv, "c:d:n")) != -1) { switch (c) { case 'c': opt_configfile = optarg; break; case 'd': isns_enable_debugging(optarg); break; case 'n': opt_replace = 0; break; default: isns_fatal("Unknown option\n"); } } isns_read_config(opt_configfile); isns_assign_string(&isns_config.ic_source_name, "iqn.1991-05.com.microsoft:orange"); clnt = isns_create_default_client(NULL); reg = isns_simple_create(ISNS_SCN_DEREGISTER, clnt->ic_source, NULL); /* Message attributes */ attrs = ®->is_message_attrs; STR(ISCSI_NAME, "iqn.1991-05.com.microsoft:orange"); status = isns_client_call(clnt, ®); if (status != ISNS_SUCCESS) isns_error("SCNDereg failed: %s\n", isns_strerror(status)); isns_simple_free(reg); reg = isns_simple_create(ISNS_DEVICE_DEREGISTER, clnt->ic_source, NULL); attrs = ®->is_operating_attrs; STR(ENTITY_IDENTIFIER, "troopa.nki.nl"); U32(ENTITY_PROTOCOL, 2); isns_portal_parse(&portal_info, "192.168.1.40:3229/tcp", NULL); isns_portal_to_attr_list(&portal_info, ISNS_TAG_PORTAL_IP_ADDRESS, ISNS_TAG_PORTAL_TCP_UDP_PORT, attrs); STR(ISCSI_NAME, "iqn.1991-05.com.microsoft:orange"); status = isns_client_call(clnt, ®); if (status != ISNS_SUCCESS) isns_fatal("DevDereg failed: %s\n", isns_strerror(status)); isns_simple_free(reg); reg = isns_simple_create(ISNS_DEVICE_ATTRIBUTE_REGISTER, clnt->ic_source, NULL); reg->is_replace = opt_replace; attrs = ®->is_operating_attrs; STR(ENTITY_IDENTIFIER, "troopa.nki.nl"); U32(ENTITY_PROTOCOL, 2); isns_portal_parse(&portal_info, "192.168.1.40:3229/tcp", NULL); isns_portal_to_attr_list(&portal_info, ISNS_TAG_PORTAL_IP_ADDRESS, ISNS_TAG_PORTAL_TCP_UDP_PORT, attrs); U32(SCN_PORT, 3230); U32(ESI_PORT, 3230); U32(PG_TAG, 1); STR(PG_ISCSI_NAME, "iqn.1991-05.com.microsoft:orange"); STR(ISCSI_NAME, "iqn.1991-05.com.microsoft:orange"); U32(ISCSI_NODE_TYPE, ISNS_ISCSI_INITIATOR_MASK); STR(ISCSI_ALIAS, "<MS SW iSCSI Initiator>"); status = isns_client_call(clnt, ®); if (status != ISNS_SUCCESS) isns_fatal("DevAttrReg failed: %s\n", isns_strerror(status)); isns_simple_free(reg); reg = isns_simple_create(ISNS_DEVICE_GET_NEXT, clnt->ic_source, NULL); attrs = ®->is_message_attrs; NIL(ISCSI_NAME); attrs = ®->is_operating_attrs; U32(ISCSI_NODE_TYPE, ISNS_ISCSI_TARGET_MASK); NIL(ISCSI_NODE_TYPE); status = isns_client_call(clnt, ®); if (status != ISNS_SUCCESS) isns_fatal("DevGetNext failed: %s\n", isns_strerror(status)); isns_simple_free(reg); return 0; }
/* * Process a SCNDereg message */ int isns_process_scn_deregistration(isns_server_t *srv, isns_simple_t *call, isns_simple_t **result) { isns_attr_list_t *keys = &call->is_message_attrs; isns_db_t *db = srv->is_db; isns_attr_t *attr; isns_object_t *node = NULL; int status = ISNS_SUCCESS; /* * 5.6.5.6 * The SCNDereg request message PDU Payload contains a Source Attribute * and Message Key Attribute(s). Valid Message Key Attributes for a * SCNDereg are shown below: * * Valid Message Key Attributes for SCNDereg * ----------------------------------------- * iSCSI Name * FC Port Name WWPN * * There are no Operating Attributes in the SCNDereg message. */ if (keys->ial_count != 1) return ISNS_SCN_REGISTRATION_REJECTED; attr = keys->ial_data[0]; if (attr->ia_tag_id != ISNS_TAG_ISCSI_NAME && attr->ia_tag_id != ISNS_TAG_FC_PORT_NAME_WWPN) return ISNS_SCN_REGISTRATION_REJECTED; /* Look up the storage node for this source. If it does * not exist, reject the message. */ node = isns_db_lookup(db, NULL, keys); if (node == NULL) return ISNS_SUCCESS; /* * Policy: verify that the client is permitted * to access this entity. * * This includes * - the client node must be the object owner, * or a control node. * - the policy must allow monitoring of * this object type. */ if (!isns_policy_validate_object_access(call->is_policy, call->is_source, node, call->is_function)) goto unauthorized; isns_object_set_scn_mask(node, 0); isns_scn_delete_scn(node); *result = isns_simple_create(ISNS_SCN_DEREGISTER, srv->is_source, NULL); status = ISNS_SUCCESS; out: if (node) isns_object_release(node); return status; unauthorized: status = ISNS_SOURCE_UNAUTHORIZED; goto out; }
/* * Process a SCN registration */ int isns_process_scn_register(isns_server_t *srv, isns_simple_t *call, isns_simple_t **result) { isns_attr_list_t *keys = &call->is_message_attrs; isns_attr_list_t *attrs = &call->is_operating_attrs; isns_db_t *db = srv->is_db; isns_attr_t *attr; isns_object_t *node = NULL; uint32_t scn_bitmap; isns_scn_t *scn; int status = ISNS_SUCCESS; /* * 5.6.5.5 * The SCNReg request PDU Payload contains a Source Attribute, a Message * Key Attribute, and an Operating Attribute. Valid Message Key * Attributes for a SCNReg are shown below: * * Valid Message Key Attributes for SCNReg * --------------------------------------- * iSCSI Name * FC Port Name WWPN */ if (keys->ial_count != 1 || attrs->ial_count != 1) return ISNS_SCN_REGISTRATION_REJECTED; attr = keys->ial_data[0]; if (attr->ia_tag_id != ISNS_TAG_ISCSI_NAME && attr->ia_tag_id != ISNS_TAG_FC_PORT_NAME_WWPN) return ISNS_SCN_REGISTRATION_REJECTED; /* Look up the storage node for this source. If it does * not exist, reject the message. */ node = isns_db_lookup(db, NULL, keys); if (node == NULL) return ISNS_SOURCE_UNKNOWN; /* * Policy: verify that the client is permitted * to access this entity. * * This includes * - the client node must be the object owner, * or a control node. * - the policy must allow monitoring of * this object type. */ if (!isns_policy_validate_object_access(call->is_policy, call->is_source, node, call->is_function)) goto unauthorized; /* * 5.6.5.5 * The SCN Bitmap is the only operating attribute of this message * [...] * Control Nodes MAY conduct registrations for management SCNs; * iSNS clients that are not supporting Control Nodes MUST NOT * conduct registrations for management SCNs. * * Implementer's note: for iFCP sources, we should check for * ISNS_TAG_IFCP_SCN_BITMAP. */ attr = attrs->ial_data[0]; if (attr->ia_tag_id != ISNS_TAG_ISCSI_SCN_BITMAP || !ISNS_ATTR_IS_UINT32(attr)) goto rejected; scn_bitmap = attr->ia_value.iv_uint32; if (!isns_policy_validate_scn_bitmap(call->is_policy, scn_bitmap)) goto unauthorized; /* * 5.6.5.5 * If no SCN Port fields of any Portals of the Storage Node are * registered to receive SCN messages, then the SCNReg message SHALL * be rejected with Status Code 17 (SCN Registration Rejected). */ if (!(scn = isns_scn_create_scn(node, scn_bitmap, db))) goto rejected; *result = isns_simple_create(ISNS_SCN_REGISTER, srv->is_source, NULL); status = ISNS_SUCCESS; out: if (node) isns_object_release(node); return status; rejected: status = ISNS_SCN_REGISTRATION_REJECTED; goto out; unauthorized: status = ISNS_SOURCE_UNAUTHORIZED; goto out; }
/* * Create a query, and set the source name */ static isns_simple_t * __isns_create_query(isns_source_t *source, const isns_attr_list_t *key) { return isns_simple_create(ISNS_DEVICE_ATTRIBUTE_QUERY, source, key); }