diff --git a/lib/iscsi/iscsi_rpc.c b/lib/iscsi/iscsi_rpc.c index 95e8a4423..d20210f66 100644 --- a/lib/iscsi/iscsi_rpc.c +++ b/lib/iscsi/iscsi_rpc.c @@ -343,83 +343,11 @@ invalid: } SPDK_RPC_REGISTER("delete_initiator_group", spdk_rpc_delete_initiator_group, SPDK_RPC_RUNTIME) -static void -dump_target_node(struct spdk_json_write_ctx *w, struct spdk_iscsi_tgt_node *tgtnode) -{ - struct spdk_iscsi_pg_map *pg_map; - struct spdk_iscsi_ig_map *ig_map; - int i; - - spdk_json_write_object_begin(w); - - spdk_json_write_name(w, "name"); - spdk_json_write_string(w, tgtnode->name); - - if (tgtnode->alias) { - spdk_json_write_name(w, "alias_name"); - spdk_json_write_string(w, tgtnode->alias); - } - - spdk_json_write_name(w, "pg_ig_maps"); - spdk_json_write_array_begin(w); - TAILQ_FOREACH(pg_map, &tgtnode->pg_map_head, tailq) { - TAILQ_FOREACH(ig_map, &pg_map->ig_map_head, tailq) { - spdk_json_write_object_begin(w); - spdk_json_write_name(w, "pg_tag"); - spdk_json_write_int32(w, pg_map->pg->tag); - spdk_json_write_name(w, "ig_tag"); - spdk_json_write_int32(w, ig_map->ig->tag); - spdk_json_write_object_end(w); - } - } - spdk_json_write_array_end(w); - - spdk_json_write_name(w, "luns"); - spdk_json_write_array_begin(w); - for (i = 0; i < SPDK_SCSI_DEV_MAX_LUN; i++) { - struct spdk_scsi_lun *lun = spdk_scsi_dev_get_lun(tgtnode->dev, i); - - if (lun) { - spdk_json_write_object_begin(w); - spdk_json_write_name(w, "bdev_name"); - spdk_json_write_string(w, spdk_scsi_lun_get_bdev_name(lun)); - spdk_json_write_name(w, "id"); - spdk_json_write_int32(w, spdk_scsi_lun_get_id(lun)); - spdk_json_write_object_end(w); - } - } - spdk_json_write_array_end(w); - - spdk_json_write_name(w, "queue_depth"); - spdk_json_write_int32(w, tgtnode->queue_depth); - - spdk_json_write_name(w, "disable_chap"); - spdk_json_write_bool(w, tgtnode->disable_chap); - - spdk_json_write_name(w, "require_chap"); - spdk_json_write_bool(w, tgtnode->require_chap); - - spdk_json_write_name(w, "mutual_chap"); - spdk_json_write_bool(w, tgtnode->mutual_chap); - - spdk_json_write_name(w, "chap_group"); - spdk_json_write_int32(w, tgtnode->chap_group); - - spdk_json_write_name(w, "header_digest"); - spdk_json_write_bool(w, tgtnode->header_digest); - - spdk_json_write_name(w, "data_digest"); - spdk_json_write_bool(w, tgtnode->data_digest); - - spdk_json_write_object_end(w); -} - static void spdk_rpc_get_target_nodes(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) { struct spdk_json_write_ctx *w; - struct spdk_iscsi_tgt_node *tgtnode; if (params != NULL) { spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, @@ -433,11 +361,7 @@ spdk_rpc_get_target_nodes(struct spdk_jsonrpc_request *request, } spdk_json_write_array_begin(w); - - TAILQ_FOREACH(tgtnode, &g_spdk_iscsi.target_head, tailq) { - dump_target_node(w, tgtnode); - } - + spdk_iscsi_tgt_nodes_info_json(w); spdk_json_write_array_end(w); spdk_jsonrpc_end_result(request, w); diff --git a/lib/iscsi/iscsi_subsystem.c b/lib/iscsi/iscsi_subsystem.c index dbdadbafa..d614a7735 100644 --- a/lib/iscsi/iscsi_subsystem.c +++ b/lib/iscsi/iscsi_subsystem.c @@ -214,105 +214,6 @@ spdk_iscsi_config_dump_initiator_groups(FILE *fp) } } -/* Target nodes */ -static const char *target_nodes_section = \ - "\n" - "# Users should change the TargetNode section(s) below to match the\n" - "# desired iSCSI target node configuration.\n" - "# TargetName, Mapping, LUN0 are minimum required\n"; - -#define TARGET_NODE_TMPL \ -"[TargetNode%d]\n" \ -" Comment \"Target%d\"\n" \ -" TargetName %s\n" \ -" TargetAlias \"%s\"\n" - -#define TARGET_NODE_PGIG_MAPPING_TMPL \ -" Mapping PortalGroup%d InitiatorGroup%d\n" - -#define TARGET_NODE_AUTH_TMPL \ -" AuthMethod %s\n" \ -" AuthGroup %s\n" \ -" UseDigest %s\n" - -#define TARGET_NODE_QD_TMPL \ -" QueueDepth %d\n\n" - -#define TARGET_NODE_LUN_TMPL \ -" LUN%d %s\n" - -static void -spdk_iscsi_config_dump_target_nodes(FILE *fp) -{ - int l = 0; - struct spdk_scsi_dev *dev = NULL; - struct spdk_iscsi_tgt_node *target = NULL; - struct spdk_iscsi_pg_map *pg_map; - struct spdk_iscsi_ig_map *ig_map; - - /* Create target nodes section */ - fprintf(fp, "%s", target_nodes_section); - - TAILQ_FOREACH(target, &g_spdk_iscsi.target_head, tailq) { - int idx; - const char *authmethod = "None"; - char authgroup[32] = "None"; - const char *usedigest = "Auto"; - - dev = target->dev; - if (NULL == dev) { continue; } - - idx = target->num; - fprintf(fp, TARGET_NODE_TMPL, idx, idx, target->name, spdk_scsi_dev_get_name(dev)); - - TAILQ_FOREACH(pg_map, &target->pg_map_head, tailq) { - TAILQ_FOREACH(ig_map, &pg_map->ig_map_head, tailq) { - fprintf(fp, TARGET_NODE_PGIG_MAPPING_TMPL, - pg_map->pg->tag, - ig_map->ig->tag); - } - } - - if (target->disable_chap) { - authmethod = "None"; - } else if (!target->require_chap) { - authmethod = "Auto"; - } else if (target->mutual_chap) { - authmethod = "CHAP Mutual"; - } else { - authmethod = "CHAP"; - } - - if (target->chap_group > 0) { - snprintf(authgroup, sizeof(authgroup), "AuthGroup%d", target->chap_group); - } - - if (target->header_digest) { - usedigest = "Header"; - } else if (target->data_digest) { - usedigest = "Data"; - } - - fprintf(fp, TARGET_NODE_AUTH_TMPL, - authmethod, authgroup, usedigest); - - for (l = 0; l < SPDK_SCSI_DEV_MAX_LUN; l++) { - struct spdk_scsi_lun *lun = spdk_scsi_dev_get_lun(dev, l); - - if (!lun) { - continue; - } - - fprintf(fp, TARGET_NODE_LUN_TMPL, - spdk_scsi_lun_get_id(lun), - spdk_scsi_lun_get_bdev_name(lun)); - } - - fprintf(fp, TARGET_NODE_QD_TMPL, - target->queue_depth); - } -} - static void spdk_mobj_ctor(struct spdk_mempool *mp, __attribute__((unused)) void *arg, void *_m, __attribute__((unused)) unsigned i) @@ -1113,7 +1014,7 @@ spdk_iscsi_config_text(FILE *fp) spdk_iscsi_config_dump_section(fp); spdk_iscsi_config_dump_portal_groups(fp); spdk_iscsi_config_dump_initiator_groups(fp); - spdk_iscsi_config_dump_target_nodes(fp); + spdk_iscsi_tgt_nodes_config_text(fp); } SPDK_LOG_REGISTER_COMPONENT("iscsi", SPDK_LOG_ISCSI) diff --git a/lib/iscsi/tgt_node.c b/lib/iscsi/tgt_node.c index cc730de2b..d8623a150 100644 --- a/lib/iscsi/tgt_node.c +++ b/lib/iscsi/tgt_node.c @@ -1331,3 +1331,208 @@ spdk_iscsi_tgt_node_add_lun(struct spdk_iscsi_tgt_node *target, return 0; } + +static const char *target_nodes_section = \ + "\n" + "# Users should change the TargetNode section(s) below to match the\n" + "# desired iSCSI target node configuration.\n" + "# TargetName, Mapping, LUN0 are minimum required\n"; + +#define TARGET_NODE_TMPL \ +"[TargetNode%d]\n" \ +" Comment \"Target%d\"\n" \ +" TargetName %s\n" \ +" TargetAlias \"%s\"\n" + +#define TARGET_NODE_PGIG_MAPPING_TMPL \ +" Mapping PortalGroup%d InitiatorGroup%d\n" + +#define TARGET_NODE_AUTH_TMPL \ +" AuthMethod %s\n" \ +" AuthGroup %s\n" \ +" UseDigest %s\n" + +#define TARGET_NODE_QD_TMPL \ +" QueueDepth %d\n\n" + +#define TARGET_NODE_LUN_TMPL \ +" LUN%d %s\n" + +void +spdk_iscsi_tgt_nodes_config_text(FILE *fp) +{ + int l = 0; + struct spdk_scsi_dev *dev = NULL; + struct spdk_iscsi_tgt_node *target = NULL; + struct spdk_iscsi_pg_map *pg_map; + struct spdk_iscsi_ig_map *ig_map; + + /* Create target nodes section */ + fprintf(fp, "%s", target_nodes_section); + + TAILQ_FOREACH(target, &g_spdk_iscsi.target_head, tailq) { + int idx; + const char *authmethod = "None"; + char authgroup[32] = "None"; + const char *usedigest = "Auto"; + + dev = target->dev; + if (NULL == dev) { continue; } + + idx = target->num; + fprintf(fp, TARGET_NODE_TMPL, idx, idx, target->name, spdk_scsi_dev_get_name(dev)); + + TAILQ_FOREACH(pg_map, &target->pg_map_head, tailq) { + TAILQ_FOREACH(ig_map, &pg_map->ig_map_head, tailq) { + fprintf(fp, TARGET_NODE_PGIG_MAPPING_TMPL, + pg_map->pg->tag, + ig_map->ig->tag); + } + } + + if (target->disable_chap) { + authmethod = "None"; + } else if (!target->require_chap) { + authmethod = "Auto"; + } else if (target->mutual_chap) { + authmethod = "CHAP Mutual"; + } else { + authmethod = "CHAP"; + } + + if (target->chap_group > 0) { + snprintf(authgroup, sizeof(authgroup), "AuthGroup%d", target->chap_group); + } + + if (target->header_digest) { + usedigest = "Header"; + } else if (target->data_digest) { + usedigest = "Data"; + } + + fprintf(fp, TARGET_NODE_AUTH_TMPL, + authmethod, authgroup, usedigest); + + for (l = 0; l < SPDK_SCSI_DEV_MAX_LUN; l++) { + struct spdk_scsi_lun *lun = spdk_scsi_dev_get_lun(dev, l); + + if (!lun) { + continue; + } + + fprintf(fp, TARGET_NODE_LUN_TMPL, + spdk_scsi_lun_get_id(lun), + spdk_scsi_lun_get_bdev_name(lun)); + } + + fprintf(fp, TARGET_NODE_QD_TMPL, + target->queue_depth); + } +} + +static void +spdk_iscsi_tgt_node_info_json(struct spdk_iscsi_tgt_node *target, + struct spdk_json_write_ctx *w) +{ + struct spdk_iscsi_pg_map *pg_map; + struct spdk_iscsi_ig_map *ig_map; + int i; + + spdk_json_write_object_begin(w); + + spdk_json_write_name(w, "name"); + spdk_json_write_string(w, target->name); + + if (target->alias) { + spdk_json_write_name(w, "alias_name"); + spdk_json_write_string(w, target->alias); + } + + spdk_json_write_name(w, "pg_ig_maps"); + spdk_json_write_array_begin(w); + TAILQ_FOREACH(pg_map, &target->pg_map_head, tailq) { + TAILQ_FOREACH(ig_map, &pg_map->ig_map_head, tailq) { + spdk_json_write_object_begin(w); + spdk_json_write_name(w, "pg_tag"); + spdk_json_write_int32(w, pg_map->pg->tag); + spdk_json_write_name(w, "ig_tag"); + spdk_json_write_int32(w, ig_map->ig->tag); + spdk_json_write_object_end(w); + } + } + spdk_json_write_array_end(w); + + spdk_json_write_name(w, "luns"); + spdk_json_write_array_begin(w); + for (i = 0; i < SPDK_SCSI_DEV_MAX_LUN; i++) { + struct spdk_scsi_lun *lun = spdk_scsi_dev_get_lun(target->dev, i); + + if (lun) { + spdk_json_write_object_begin(w); + spdk_json_write_name(w, "bdev_name"); + spdk_json_write_string(w, spdk_scsi_lun_get_bdev_name(lun)); + spdk_json_write_name(w, "id"); + spdk_json_write_int32(w, spdk_scsi_lun_get_id(lun)); + spdk_json_write_object_end(w); + } + } + spdk_json_write_array_end(w); + + spdk_json_write_name(w, "queue_depth"); + spdk_json_write_int32(w, target->queue_depth); + + spdk_json_write_name(w, "disable_chap"); + spdk_json_write_bool(w, target->disable_chap); + + spdk_json_write_name(w, "require_chap"); + spdk_json_write_bool(w, target->require_chap); + + spdk_json_write_name(w, "mutual_chap"); + spdk_json_write_bool(w, target->mutual_chap); + + spdk_json_write_name(w, "chap_group"); + spdk_json_write_int32(w, target->chap_group); + + spdk_json_write_name(w, "header_digest"); + spdk_json_write_bool(w, target->header_digest); + + spdk_json_write_name(w, "data_digest"); + spdk_json_write_bool(w, target->data_digest); + + spdk_json_write_object_end(w); +} + +static void +spdk_iscsi_tgt_node_config_json(struct spdk_iscsi_tgt_node *target, + struct spdk_json_write_ctx *w) +{ + spdk_json_write_object_begin(w); + + spdk_json_write_name(w, "method"); + spdk_json_write_string(w, "construct_target_node"); + + spdk_json_write_name(w, "params"); + spdk_iscsi_tgt_node_info_json(target, w); + + spdk_json_write_object_end(w); +} + +void +spdk_iscsi_tgt_nodes_info_json(struct spdk_json_write_ctx *w) +{ + struct spdk_iscsi_tgt_node *target; + + TAILQ_FOREACH(target, &g_spdk_iscsi.target_head, tailq) { + spdk_iscsi_tgt_node_info_json(target, w); + } +} + +void +spdk_iscsi_tgt_nodes_config_json(struct spdk_json_write_ctx *w) +{ + struct spdk_iscsi_tgt_node *target; + + TAILQ_FOREACH(target, &g_spdk_iscsi.target_head, tailq) { + spdk_iscsi_tgt_node_config_json(target, w); + } +} diff --git a/lib/iscsi/tgt_node.h b/lib/iscsi/tgt_node.h index 60505ca03..f68f7d67c 100644 --- a/lib/iscsi/tgt_node.h +++ b/lib/iscsi/tgt_node.h @@ -43,6 +43,7 @@ struct spdk_iscsi_conn; struct spdk_iscsi_init_grp; struct spdk_iscsi_portal_grp; struct spdk_iscsi_portal; +struct spdk_json_write_ctx; #define MAX_TARGET_MAP 256 #define SPDK_TN_TAG_MAX 0x0000ffff @@ -136,4 +137,7 @@ void spdk_iscsi_tgt_node_delete_map(struct spdk_iscsi_portal_grp *portal_group, struct spdk_iscsi_init_grp *initiator_group); int spdk_iscsi_tgt_node_add_lun(struct spdk_iscsi_tgt_node *target, const char *bdev_name, int lun_id); +void spdk_iscsi_tgt_nodes_config_text(FILE *fp); +void spdk_iscsi_tgt_nodes_info_json(struct spdk_json_write_ctx *w); +void spdk_iscsi_tgt_nodes_config_json(struct spdk_json_write_ctx *w); #endif /* SPDK_ISCSI_TGT_NODE_H_ */ diff --git a/test/unit/lib/iscsi/tgt_node.c/tgt_node_ut.c b/test/unit/lib/iscsi/tgt_node.c/tgt_node_ut.c index 9515bc376..eda02db68 100644 --- a/test/unit/lib/iscsi/tgt_node.c/tgt_node_ut.c +++ b/test/unit/lib/iscsi/tgt_node.c/tgt_node_ut.c @@ -41,6 +41,7 @@ #include "../common.c" #include "iscsi/tgt_node.c" #include "scsi/scsi_internal.h" +#include "unit/lib/json_mock.c" struct spdk_iscsi_globals g_spdk_iscsi;