/* * Perform operation on all targets */ static int isns_op_all(uint16_t op) { int so; tgt_node_t *tgt = NULL; char *iname; if (isns_server_connection_thr_running == False) { syslog(LOG_ERR, "isns_op_all: iSNS discovery is not running." " Check the previous iSNS initialization error."); return (-1); } if ((so = isns_open(isns_args.server)) == -1) { syslog(LOG_ERR, "isns_op_all: failed to open isns server %s", isns_args.server); return (-1); } while ((tgt = tgt_node_next_child(targets_config, XML_ELEMENT_TARG, tgt)) != NULL) { if (tgt_find_value_str(tgt, XML_ELEMENT_INAME, &iname) == FALSE) { continue; } switch (op) { case ISNS_DEV_DEREG: if (isns_dev_attr_dereg(so, iname) == -1) { syslog(LOG_ERR, "ISNS de-register failed\n"); } num_reg = 0; break; case ISNS_SCN_DEREG: if (isns_scn_dereg(so, iname) == -1) { syslog(LOG_ERR, "ISNS SCN de-register failed\n"); } break; case ISNS_SCN_REG: if (isns_scn_reg(so, iname) == -1) { syslog(LOG_ERR, "ISNS SCN register failed\n"); } break; case ISNS_TGT_LOGOUT: logout_targ(iname); break; default: break; } free(iname); } isns_close(so); return (0); }
/* * []---- * | validate_isns_server -- validate that server[:port] are valid * []---- */ char * valid_isns_srv(char *name, char *prop) { char *msg = NULL; char *sp, *p; int so; int port; if (strlen(prop) > MAXHOSTNAMELEN) { xml_rtn_msg(&msg, ERR_INVALID_ISNS_SRV); return (msg); } if ((sp = strdup(prop)) == NULL) { xml_rtn_msg(&msg, ERR_NO_MEM); return (msg); } if ((p = strrchr(sp, ':')) != NULL) { *p++ = '\0'; port = atoi(p); if ((port < 1) || (port > 65535)) { xml_rtn_msg(&msg, ERR_INVALID_ISNS_SRV); free(sp); return (msg); } } so = isns_open(sp); if (so < 0) { if (isns_enabled() == True) { xml_rtn_msg(&msg, ERR_INVALID_ISNS_SRV); } else { /* Just print a warning and accept the server */ syslog(LOG_ALERT, "Check if the server:%s is valid", sp); } } else { isns_close(so); } free(sp); return (msg); }
/* * isns_reg is called to register new target */ int isns_reg(char *targ) { int so; tgt_node_t *tgt; char *iqn = NULL; if (isns_server_connection_thr_running == False) { syslog(LOG_ERR, "isns_reg: iSNS discovery is not running." " Check the previous iSNS initialization error."); return (-1); } if ((so = isns_open(isns_args.server)) == -1) { syslog(LOG_ERR, "isns_reg failed with server: %s", isns_args.server); return (-1); } /* * Open targets_config and devAttrReg all nodes */ if ((tgt = find_tgt_by_name(targ, &iqn)) != NULL) { if (isns_dev_attr_reg(so, tgt, iqn, tgt->x_value) != 0) { syslog(LOG_ALERT, "ISNS registration failed %s\n", tgt->x_value); goto error; } if (isns_scn_reg(so, iqn) == -1) { syslog(LOG_ERR, "ISNS SCN register failed\n"); } } error: if (iqn) free(iqn); isns_close(so); return (0); }
/* * Deregister an iscsi target node */ int isns_dereg(char *name) { int so; int ret; if (isns_server_connection_thr_running == False) { syslog(LOG_ERR, "isns_dereg: iSNS discovery is not running." " Check the previous iSNS initialization error."); return (-1); } if ((so = isns_open(isns_args.server)) == -1) { return (-1); } ret = isns_dev_attr_dereg(so, name); isns_close(so); return (ret); }
/* * Query an iscsi initiator node */ Boolean_t isns_qry_initiator(char *target, char *initiator) { int so; int ret; if (isns_server_connection_thr_running == False) { syslog(LOG_ERR, "isns_qry_initiator: iSNS discovery is not running" " Check the previous iSNS initialization error."); return (-1); } if ((so = isns_open(isns_args.server)) == -1) { syslog(LOG_ERR, "isns_qry failed"); return (-1); } ret = isns_dev_attr_qry(so, target, initiator); isns_close(so); return (ret == 1 ? True : False); }
static int is_isns_server_up(char *server) { int so; socklen_t len; struct sockaddr sa; /* no server specified */ if (server == NULL) { return (-1); } /* * open isns server connect and determine which PF_INET to use */ if ((so = isns_open(server)) < 0) { syslog(LOG_ERR, "isns server %s not found", server); return (-1); } len = sizeof (sa); if (getsockname(so, &sa, &len) < 0) { isns_close(so); syslog(LOG_ALERT, "isns getsockname failed"); return (-1); } isns_close(so); if (sa.sa_family != PF_INET && sa.sa_family != PF_INET6) { syslog(LOG_ERR, "isns unknown domain type"); return (-1); } return (0); }
/* * Update an existing iscsi target property */ int isns_dev_update(char *targ, uint32_t mods) { int so; int flags = 0; /* update only */ char *iname = NULL; char *dummy = NULL; char alias[MAXNAMELEN]; tgt_node_t *tgt = NULL; isns_pdu_t *cmd; isns_rsp_t *rsp; int ret = -1; if (mods == 0) return (0); if (isns_server_connection_thr_running == False) { syslog(LOG_ERR, "isns_dev_update: iSNS discovery is not running." " Check the previous iSNS initialization error."); return (-1); } if ((tgt = find_tgt_by_name(targ, &iname)) != NULL) { if (tgt_find_value_str(tgt, XML_ELEMENT_ALIAS, &dummy) == True) { (void) strcpy(alias, dummy); free(dummy); } else (void) strcpy(alias, tgt->x_value); if ((so = isns_open(isns_args.server)) < 0) { goto error; } if (isns_create_pdu(ISNS_DEV_ATTR_REG, flags, &cmd)) { goto error; } /* source attr, msg key, delimiter */ if (isns_append_attr(cmd, ISNS_ISCSI_NAME_ATTR_ID, STRLEN(iname), iname, 0) != 0) { goto error; } if (isns_append_attr(cmd, ISNS_EID_ATTR_ID, STRLEN(isns_args.entity), isns_args.entity, 0) != 0) { goto error; } if (isns_append_attr(cmd, ISNS_DELIMITER_ATTR_ID, 0, NULL, 0) != 0) { goto error; } /* * get current operating attributes, alias & portal group * objects, these should be the only things that get change */ (void) isns_append_attr(cmd, ISNS_ISCSI_NAME_ATTR_ID, STRLEN(iname), iname, 0); (void) isns_append_attr(cmd, ISNS_ISCSI_NODE_TYPE_ATTR_ID, ISNS_NODE_TYP_SZ, NULL, ISNS_TARGET_NODE_TYPE); if (mods & ISNS_MOD_ALIAS) if (isns_append_attr(cmd, ISNS_ISCSI_ALIAS_ATTR_ID, STRLEN(alias), alias, 0) != 0) { goto error; } if (mods & ISNS_MOD_TPGT) if (append_tpgt(tgt, cmd) != 0) { goto error; } if (isns_send(so, (isns_pdu_t *)cmd) < 0) { goto error; } if (isns_recv(so, &rsp) == -1) { goto error; } /* process response, if failed do a isns_reg_all */ if ((ret = process_rsp(cmd, rsp)) == -1) { if (isns_reg_all() != 0 || isns_scn_reg_all() != 0) { syslog(LOG_ALERT, "ISNS register failed\n"); goto error; } ret = 0; } else { if (isns_scn_reg(so, iname) == -1) { syslog(LOG_ERR, "ISNS SCN register failed\n"); goto error; } ret = 0; } } else { syslog(LOG_ERR, "ISNS: fails to update target %s\n", alias); } error: if (cmd) isns_free_pdu(cmd); if (rsp) isns_free_pdu(rsp); if (iname) free(iname); isns_close(so); return (ret); }
/* * Register all iscsi target nodes from the XML database * Alway use the ISNS_FLAG_REPLACE_REG flag */ int isns_reg_all() { int so; uint32_t flags = ISNS_FLAG_REPLACE_REG; isns_pdu_t *cmd = NULL; isns_rsp_t *rsp = NULL; char *n = NULL; char *a = NULL; char alias[MAXNAMELEN]; char iname[MAXNAMELEN]; tgt_node_t *tgt = NULL; int ret = -1; int tgt_cnt = 0; if (isns_server_connection_thr_running == False) { syslog(LOG_ERR, "isns_reg_all: iSNS discovery is not running." " Check the previous iSNS initialization error."); return (-1); } /* * get the 1st target and use it for the source attribute */ if ((tgt = tgt_node_next_child(targets_config, XML_ELEMENT_TARG, tgt)) == NULL) { return (0); } if (tgt->x_value == NULL) { syslog(LOG_ALERT, "ISNS: target with NULL local name\n"); return (-1); } if (tgt_find_value_str(tgt, XML_ELEMENT_INAME, &n) == FALSE) { syslog(LOG_ALERT, "ISNS: no XML_ELEMENT_INAME found\n"); return (-1); } (void) strcpy(iname, n); free(n); if ((so = isns_open(isns_args.server)) == -1) { syslog(LOG_ALERT, "ISNS: fails to connect to %s\n", isns_args.server); return (-1); } if (isns_create_pdu(ISNS_DEV_ATTR_REG, flags, &cmd) != 0) { goto error; } /* source attribute */ if (isns_append_attr(cmd, ISNS_ISCSI_NAME_ATTR_ID, STRLEN(iname), iname, 0) != 0) { goto error; } /* add message key attribute */ if (isns_append_attr(cmd, ISNS_EID_ATTR_ID, STRLEN(isns_args.entity), isns_args.entity, 0) != 0) { goto error; } /* add delimiter */ if (isns_append_attr(cmd, ISNS_DELIMITER_ATTR_ID, 0, NULL, 0) != 0) { goto error; } /* entity id */ if (isns_append_attr(cmd, ISNS_EID_ATTR_ID, STRLEN(isns_args.entity), isns_args.entity, 0) != 0) { goto error; } /* entity type */ if (isns_append_attr(cmd, ISNS_ENTITY_PROTOCOL_ATTR_ID, ISNS_ENTITY_TYP_SZ, NULL, ISNS_ENTITY_PROTOCOL_ISCSI) != 0) { goto error; } /* portal ip-addr */ if (isns_append_attr(cmd, ISNS_PORTAL_IP_ADDR_ATTR_ID, eid_ip.ai_addrlen, (void *)&eid_ip.ip_adr, eid_ip.ip_len) != 0) { goto error; } /* portal port */ if (isns_append_attr(cmd, ISNS_PORTAL_PORT_ATTR_ID, ISNS_PORT_SZ, NULL, iscsi_port) != 0) { goto error; } /* ESI interval */ if (isns_append_attr(cmd, ISNS_ESI_INTERVAL_ATTR_ID, ISNS_ESI_TICK_SZ, NULL, 10) != 0) { goto error; } /* scn port */ if (isns_append_attr(cmd, ISNS_SCN_PORT_ATTR_ID, ISNS_PORT_SZ, NULL, scn_port) != 0) { goto error; } /* esi port */ if (isns_append_attr(cmd, ISNS_ESI_PORT_ATTR_ID, ISNS_PORT_SZ, NULL, scn_port) != 0) { goto error; } /* * Open targets_config and devAttrReg all nodes */ tgt = NULL; while ((tgt = tgt_node_next_child(targets_config, XML_ELEMENT_TARG, tgt)) != NULL) { if (tgt->x_value == NULL) { syslog(LOG_ALERT, "ISNS: target with NULL name\n"); continue; } /* use this value as alias if alias is not set */ (void) strcpy(alias, tgt->x_value); if (tgt_find_value_str(tgt, XML_ELEMENT_INAME, &n) == FALSE) { continue; } (void) strcpy(iname, n); free(n); /* find alias */ if (tgt_find_value_str(tgt, XML_ELEMENT_ALIAS, &a) == TRUE) { (void) strcpy(alias, a); free(a); } tgt_cnt++; /* increment target count */ /* operation attributes */ if (isns_append_attr(cmd, ISNS_ISCSI_NAME_ATTR_ID, STRLEN(iname), iname, 0) != 0) { goto error; } if (isns_append_attr(cmd, ISNS_ISCSI_NODE_TYPE_ATTR_ID, 4, NULL, ISNS_TARGET_NODE_TYPE) != 0) { goto error; } if (isns_append_attr(cmd, ISNS_ISCSI_ALIAS_ATTR_ID, STRLEN(alias), alias, 0) != 0) { goto error; } if (append_tpgt(tgt, cmd) != 0) { goto error; } } /* send pdu */ if (isns_send(so, cmd) == -1) { goto error; } /* get isns response */ if (isns_recv(so, &rsp) == -1) { goto error; } /* process response */ if (process_rsp(cmd, rsp) == 0) { ret = 0; num_reg = tgt_cnt; queue_prt(mgmtq, Q_ISNS_DBG, "DevAttrRegAll successful"); } else { syslog(LOG_ALERT, "DevAttrReg failed"); } error: if (cmd) isns_free_pdu(cmd); if (rsp) isns_free_pdu(rsp); isns_close(so); return (ret); }
/* * Register a new node, need to find another node that is already registered * DevAttrReg * RFC 4171 Section 5.6.5.5 indicated SCN-port-tag (23) needed to be * included in the registration * Also need to register ESI-port-tag (20) see Section 6.3.5 */ static int isns_dev_attr_reg(int so, tgt_node_t *tgt, char *node, char *alias) { isns_pdu_t *cmd = NULL; isns_rsp_t *rsp = NULL; uint32_t flags = 0; int ret = 0; Boolean_t found = False; tgt_node_t *src = NULL; char *src_nm = NULL; queue_prt(mgmtq, Q_ISNS_DBG, "ISNS_DEV_ATTR_REG"); if ((so = isns_open(isns_args.server)) == -1) { return (-1); } if (num_reg == 0) { flags |= ISNS_FLAG_REPLACE_REG; } if (isns_create_pdu(ISNS_DEV_ATTR_REG, flags, &cmd) != 0) { return (-1); } if (num_reg == 0) { /* add new node to source attribute */ if (isns_append_attr(cmd, ISNS_ISCSI_NAME_ATTR_ID, STRLEN(node), node, 0) != 0) { goto error; } } else { /* find a registered node to use */ do { src = find_next_tgt(src, &src_nm); if (src == NULL) { syslog(LOG_ALERT, "ISNS out of sync\n"); goto error; } if (tgt == src) { free(src_nm); src_nm = NULL; continue; } else { found = True; } } while (found == False); if (isns_append_attr(cmd, ISNS_ISCSI_NAME_ATTR_ID, STRLEN(src_nm), src_nm, 0) != 0) { goto error; } } /* add message key attribute */ if (isns_append_attr(cmd, ISNS_EID_ATTR_ID, STRLEN(isns_args.entity), isns_args.entity, 0) != 0) { goto error; } /* add delimiter */ if (isns_append_attr(cmd, ISNS_DELIMITER_ATTR_ID, 0, NULL, 0) != 0) { goto error; } /* add operation attributes */ /* entity id */ if (isns_append_attr(cmd, ISNS_EID_ATTR_ID, STRLEN(isns_args.entity), isns_args.entity, 0) != 0) { goto error; } /* entity type */ if (isns_append_attr(cmd, ISNS_ENTITY_PROTOCOL_ATTR_ID, ISNS_ENTITY_TYP_SZ, NULL, ISNS_ENTITY_PROTOCOL_ISCSI) != 0) { goto error; } /* * Register entity portal properties the 1st time */ if (num_reg == 0) { /* portal ip-addr */ if (isns_append_attr(cmd, ISNS_PORTAL_IP_ADDR_ATTR_ID, eid_ip.ai_addrlen, (void *)&eid_ip.ip_adr, eid_ip.ip_len) != 0) { goto error; } /* portal port */ if (isns_append_attr(cmd, ISNS_PORTAL_PORT_ATTR_ID, ISNS_PORT_SZ, NULL, iscsi_port) != 0) { goto error; } /* ESI interval */ if (isns_append_attr(cmd, ISNS_ESI_INTERVAL_ATTR_ID, ISNS_ESI_TICK_SZ, NULL, 10) != 0) { goto error; } /* scn port */ if (isns_append_attr(cmd, ISNS_SCN_PORT_ATTR_ID, ISNS_PORT_SZ, NULL, scn_port) != 0) { goto error; } /* esi port */ if (isns_append_attr(cmd, ISNS_ESI_PORT_ATTR_ID, ISNS_PORT_SZ, NULL, scn_port) != 0) { goto error; } } /* iscsi node name */ if (isns_append_attr(cmd, ISNS_ISCSI_NAME_ATTR_ID, STRLEN(node), node, 0) != 0) { goto error; } /* iscsi node type */ if (isns_append_attr(cmd, ISNS_ISCSI_NODE_TYPE_ATTR_ID, ISNS_NODE_TYP_SZ, NULL, ISNS_TARGET_NODE_TYPE) != 0) { goto error; } /* iscsi node alias */ if (isns_append_attr(cmd, ISNS_ISCSI_ALIAS_ATTR_ID, STRLEN(alias), alias, 0) != 0) { goto error; } /* PGT */ if (append_tpgt(tgt, cmd) != 0) { goto error; } /* send pdu */ if (isns_send(so, cmd) == -1) { goto error; } /* get isns response */ if (isns_recv(so, &rsp) == -1) { goto error; } /* process response */ if ((ret = process_rsp(cmd, rsp)) == 0) { num_reg++; } error: /* Free all resouces here */ if (cmd) isns_free_pdu(cmd); if (rsp) isns_free_pdu(rsp); if (src_nm) free(src_nm); return (ret); }