From b8705bf48cdae9fc146dee48d5c7de46c7187631 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Wed, 15 Nov 2017 09:14:27 +0900 Subject: [PATCH] iscsi: manage IG's name and mask by linked list To add initiators to an existing target, manage name and netmask of initiator group by linked list. It is not easy for array to detect duplication and change configuration. Change-Id: Id9e77740e24ac309a33d8de1be37663681160d94 Signed-off-by: Shuhei Matsumoto Reviewed-on: https://review.gerrithub.io/379932 Reviewed-by: Jim Harris Reviewed-by: Ziye Yang Reviewed-by: Daniel Verkamp Tested-by: SPDK Automated Test System --- lib/iscsi/init_grp.c | 201 ++++++++++--- lib/iscsi/init_grp.h | 14 +- lib/iscsi/iscsi_rpc.c | 11 +- lib/iscsi/iscsi_subsystem.c | 13 +- lib/iscsi/tgt_node.c | 37 +-- test/unit/lib/iscsi/init_grp.c/init_grp_ut.c | 296 +++++++++++++++++++ test/unit/lib/iscsi/tgt_node.c/tgt_node_ut.c | 20 +- 7 files changed, 507 insertions(+), 85 deletions(-) diff --git a/lib/iscsi/init_grp.c b/lib/iscsi/init_grp.c index b4ab61898..594927bec 100644 --- a/lib/iscsi/init_grp.c +++ b/lib/iscsi/init_grp.c @@ -62,99 +62,203 @@ spdk_iscsi_init_grp_create(int tag) ig->tag = tag; ig->state = GROUP_INIT; + TAILQ_INIT(&ig->initiator_head); + TAILQ_INIT(&ig->netmask_head); return ig; } +static struct spdk_iscsi_initiator_name * +spdk_iscsi_init_grp_find_initiator(struct spdk_iscsi_init_grp *ig, char *name) +{ + struct spdk_iscsi_initiator_name *iname; + + TAILQ_FOREACH(iname, &ig->initiator_head, tailq) { + if (!strcmp(iname->name, name)) { + return iname; + } + } + return NULL; +} + +static int +spdk_iscsi_init_grp_add_initiator(struct spdk_iscsi_init_grp *ig, char *name) +{ + struct spdk_iscsi_initiator_name *iname; + + if (ig->ninitiators >= MAX_INITIATOR) { + SPDK_ERRLOG("> MAX_INITIATOR(=%d) is not allowed\n", MAX_INITIATOR); + return -EPERM; + } + + iname = spdk_iscsi_init_grp_find_initiator(ig, name); + if (iname != NULL) { + return -EEXIST; + } + + iname = malloc(sizeof(*iname)); + if (iname == NULL) { + return -ENOMEM; + } + + iname->name = strdup(name); + if (iname->name == NULL) { + free(iname); + return -ENOMEM; + } + + TAILQ_INSERT_TAIL(&ig->initiator_head, iname, tailq); + ig->ninitiators++; + + SPDK_DEBUGLOG(SPDK_TRACE_ISCSI, "InitiatorName %s\n", name); + return 0; +} + +static int +spdk_iscsi_init_grp_delete_initiator(struct spdk_iscsi_init_grp *ig, char *name) +{ + struct spdk_iscsi_initiator_name *iname; + + iname = spdk_iscsi_init_grp_find_initiator(ig, name); + if (iname == NULL) { + return -ENOENT; + } + + TAILQ_REMOVE(&ig->initiator_head, iname, tailq); + ig->ninitiators--; + free(iname->name); + free(iname); + return 0; +} + static int spdk_iscsi_init_grp_add_initiators(struct spdk_iscsi_init_grp *ig, int num_inames, char **inames) { int i; + int rc; - if (num_inames > MAX_INITIATOR) { - SPDK_ERRLOG("%d > MAX_INITIATOR\n", num_inames); - return -EPERM; - } - - ig->initiators = calloc(num_inames, sizeof(char *)); - if (ig->initiators == NULL) { - return -ENOMEM; - } - ig->ninitiators = num_inames; - - for (i = 0; i < ig->ninitiators; i++) { - SPDK_DEBUGLOG(SPDK_TRACE_ISCSI, "InitiatorName %s\n", inames[i]); - ig->initiators[i] = strdup(inames[i]); - if (ig->initiators[i] == NULL) { + for (i = 0; i < num_inames; i++) { + rc = spdk_iscsi_init_grp_add_initiator(ig, inames[i]); + if (rc < 0) { goto cleanup; } } - return 0; cleanup: for (; i > 0; --i) { - free(ig->initiators[i - 1]); + spdk_iscsi_init_grp_delete_initiator(ig, inames[i - 1]); } - free(ig->initiators); - - return -ENOMEM; + return rc; } static void spdk_iscsi_init_grp_delete_all_initiators(struct spdk_iscsi_init_grp *ig) { - int i; + struct spdk_iscsi_initiator_name *iname, *tmp; - for (i = 0; i < ig->ninitiators; i++) { - free(ig->initiators[i]); + TAILQ_FOREACH_SAFE(iname, &ig->initiator_head, tailq, tmp) { + TAILQ_REMOVE(&ig->initiator_head, iname, tailq); + ig->ninitiators--; + free(iname->name); + free(iname); } - free(ig->initiators); +} + +static struct spdk_iscsi_initiator_netmask * +spdk_iscsi_init_grp_find_netmask(struct spdk_iscsi_init_grp *ig, const char *mask) +{ + struct spdk_iscsi_initiator_netmask *netmask; + + TAILQ_FOREACH(netmask, &ig->netmask_head, tailq) { + if (!strcmp(netmask->mask, mask)) { + return netmask; + } + } + return NULL; +} + +static int +spdk_iscsi_init_grp_add_netmask(struct spdk_iscsi_init_grp *ig, char *mask) +{ + struct spdk_iscsi_initiator_netmask *imask; + + if (ig->nnetmasks >= MAX_NETMASK) { + SPDK_ERRLOG("> MAX_NETMASK(=%d) is not allowed\n", MAX_NETMASK); + return -EPERM; + } + + imask = spdk_iscsi_init_grp_find_netmask(ig, mask); + if (imask != NULL) { + return -EEXIST; + } + + imask = malloc(sizeof(*imask)); + if (imask == NULL) { + return -ENOMEM; + } + + imask->mask = strdup(mask); + if (imask->mask == NULL) { + free(imask); + return -ENOMEM; + } + + TAILQ_INSERT_TAIL(&ig->netmask_head, imask, tailq); + ig->nnetmasks++; + + SPDK_DEBUGLOG(SPDK_TRACE_ISCSI, "Netmask %s\n", mask); + return 0; +} + +static int +spdk_iscsi_init_grp_delete_netmask(struct spdk_iscsi_init_grp *ig, char *mask) +{ + struct spdk_iscsi_initiator_netmask *imask; + + imask = spdk_iscsi_init_grp_find_netmask(ig, mask); + if (imask == NULL) { + return -ENOENT; + } + + TAILQ_REMOVE(&ig->netmask_head, imask, tailq); + ig->nnetmasks--; + free(imask->mask); + free(imask); + return 0; } static int spdk_iscsi_init_grp_add_netmasks(struct spdk_iscsi_init_grp *ig, int num_imasks, char **imasks) { int i; + int rc; - if (num_imasks > MAX_NETMASK) { - SPDK_ERRLOG("%d > MAX_NETMASK\n", num_imasks); - return -EPERM; - } - - ig->netmasks = calloc(num_imasks, sizeof(char *)); - if (ig->netmasks == NULL) { - return -ENOMEM; - } - ig->nnetmasks = num_imasks; - - for (i = 0; i < ig->nnetmasks; i++) { - SPDK_DEBUGLOG(SPDK_TRACE_ISCSI, "Netmask %s\n", imasks[i]); - ig->netmasks[i] = strdup(imasks[i]); - if (ig->netmasks[i] == NULL) { + for (i = 0; i < num_imasks; i++) { + rc = spdk_iscsi_init_grp_add_netmask(ig, imasks[i]); + if (rc != 0) { goto cleanup; } } - return 0; cleanup: for (; i > 0; --i) { - free(ig->netmasks[i - 1]); + spdk_iscsi_init_grp_delete_netmask(ig, imasks[i - 1]); } - free(ig->netmasks); - - return -ENOMEM; + return rc; } static void spdk_iscsi_init_grp_delete_all_netmasks(struct spdk_iscsi_init_grp *ig) { - int i; + struct spdk_iscsi_initiator_netmask *imask, *tmp; - for (i = 0; i < ig->nnetmasks; i++) { - free(ig->netmasks[i]); + TAILQ_FOREACH_SAFE(imask, &ig->netmask_head, tailq, tmp) { + TAILQ_REMOVE(&ig->netmask_head, imask, tailq); + ig->nnetmasks--; + free(imask->mask); + free(imask); } - free(ig->netmasks); } @@ -312,7 +416,6 @@ spdk_iscsi_init_grp_create_from_initiator_list(int tag, } spdk_iscsi_init_grp_register(ig); - return 0; cleanup: diff --git a/lib/iscsi/init_grp.h b/lib/iscsi/init_grp.h index d6d1c2256..5152b0d81 100644 --- a/lib/iscsi/init_grp.h +++ b/lib/iscsi/init_grp.h @@ -43,11 +43,21 @@ enum group_state { GROUP_DESTROY = 0x2, }; +struct spdk_iscsi_initiator_name { + char *name; + TAILQ_ENTRY(spdk_iscsi_initiator_name) tailq; +}; + +struct spdk_iscsi_initiator_netmask { + char *mask; + TAILQ_ENTRY(spdk_iscsi_initiator_netmask) tailq; +}; + struct spdk_iscsi_init_grp { int ninitiators; - char **initiators; + TAILQ_HEAD(, spdk_iscsi_initiator_name) initiator_head; int nnetmasks; - char **netmasks; + TAILQ_HEAD(, spdk_iscsi_initiator_netmask) netmask_head; int ref; int tag; enum group_state state; diff --git a/lib/iscsi/iscsi_rpc.c b/lib/iscsi/iscsi_rpc.c index 9a7e8c559..1a0d22dc6 100644 --- a/lib/iscsi/iscsi_rpc.c +++ b/lib/iscsi/iscsi_rpc.c @@ -49,7 +49,8 @@ spdk_rpc_get_initiator_groups(struct spdk_jsonrpc_request *request, { struct spdk_json_write_ctx *w; struct spdk_iscsi_init_grp *ig; - int i; + struct spdk_iscsi_initiator_name *iname; + struct spdk_iscsi_initiator_netmask *imask; if (params != NULL) { spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, @@ -69,8 +70,8 @@ spdk_rpc_get_initiator_groups(struct spdk_jsonrpc_request *request, spdk_json_write_name(w, "initiators"); spdk_json_write_array_begin(w); - for (i = 0; i < ig->ninitiators; i++) { - spdk_json_write_string(w, ig->initiators[i]); + TAILQ_FOREACH(iname, &ig->initiator_head, tailq) { + spdk_json_write_string(w, iname->name); } spdk_json_write_array_end(w); @@ -79,8 +80,8 @@ spdk_rpc_get_initiator_groups(struct spdk_jsonrpc_request *request, spdk_json_write_name(w, "netmasks"); spdk_json_write_array_begin(w); - for (i = 0; i < ig->nnetmasks; i++) { - spdk_json_write_string(w, ig->netmasks[i]); + TAILQ_FOREACH(imask, &ig->netmask_head, tailq) { + spdk_json_write_string(w, imask->mask); } spdk_json_write_array_end(w); diff --git a/lib/iscsi/iscsi_subsystem.c b/lib/iscsi/iscsi_subsystem.c index 8c93b6954..8354e34a2 100644 --- a/lib/iscsi/iscsi_subsystem.c +++ b/lib/iscsi/iscsi_subsystem.c @@ -170,8 +170,9 @@ static const char *initiator_group_section = \ static void spdk_iscsi_config_dump_initiator_groups(FILE *fp) { - int i; struct spdk_iscsi_init_grp *ig; + struct spdk_iscsi_initiator_name *iname; + struct spdk_iscsi_initiator_netmask *imask; /* Create initiator group section */ fprintf(fp, "%s", initiator_group_section); @@ -183,14 +184,16 @@ spdk_iscsi_config_dump_initiator_groups(FILE *fp) /* Dump initiators */ fprintf(fp, INITIATOR_TMPL); - for (i = 0; i < ig->ninitiators; i++) - fprintf(fp, "%s ", ig->initiators[i]); + TAILQ_FOREACH(iname, &ig->initiator_head, tailq) { + fprintf(fp, "%s ", iname->name); + } fprintf(fp, "\n"); /* Dump netmasks */ fprintf(fp, NETMASK_TMPL); - for (i = 0; i < ig->nnetmasks; i++) - fprintf(fp, "%s ", ig->netmasks[i]); + TAILQ_FOREACH(imask, &ig->netmask_head, tailq) { + fprintf(fp, "%s ", imask->mask); + } fprintf(fp, "\n"); } } diff --git a/lib/iscsi/tgt_node.c b/lib/iscsi/tgt_node.c index d10552439..b2d66c20d 100644 --- a/lib/iscsi/tgt_node.c +++ b/lib/iscsi/tgt_node.c @@ -180,7 +180,9 @@ spdk_iscsi_tgt_node_access(struct spdk_iscsi_conn *conn, { struct spdk_iscsi_portal_grp *pg; struct spdk_iscsi_init_grp *igp; - int i, j, k; + struct spdk_iscsi_initiator_name *iname; + struct spdk_iscsi_initiator_netmask *imask; + int i; if (conn == NULL || target == NULL || iqn == NULL || addr == NULL) return false; @@ -194,11 +196,11 @@ spdk_iscsi_tgt_node_access(struct spdk_iscsi_conn *conn, continue; /* iqn is initiator group? */ igp = target->map[i].ig; - for (j = 0; j < igp->ninitiators; j++) { + TAILQ_FOREACH(iname, &igp->initiator_head, tailq) { /* deny initiators */ - if (igp->initiators[j][0] == '!' - && (strcasecmp(&igp->initiators[j][1], "ALL") == 0 - || strcasecmp(&igp->initiators[j][1], iqn) == 0)) { + if ((iname->name[0] == '!') + && (strcasecmp(&iname->name[1], "ALL") == 0 + || strcasecmp(&iname->name[1], iqn) == 0)) { /* NG */ SPDK_DEBUGLOG(SPDK_TRACE_ISCSI, "access denied from %s (%s) to %s (%s:%s,%d)\n", @@ -207,14 +209,14 @@ spdk_iscsi_tgt_node_access(struct spdk_iscsi_conn *conn, return false; } /* allow initiators */ - if (strcasecmp(igp->initiators[j], "ALL") == 0 - || strcasecmp(igp->initiators[j], iqn) == 0) { + if (strcasecmp(iname->name, "ALL") == 0 + || strcasecmp(iname->name, iqn) == 0) { /* OK iqn, check netmask */ - for (k = 0; k < igp->nnetmasks; k++) { + TAILQ_FOREACH(imask, &igp->netmask_head, tailq) { SPDK_DEBUGLOG(SPDK_TRACE_ISCSI, "netmask=%s, addr=%s\n", - igp->netmasks[k], addr); - if (spdk_iscsi_tgt_node_allow_netmask(igp->netmasks[k], addr)) { + imask->mask, addr); + if (spdk_iscsi_tgt_node_allow_netmask(imask->mask, addr)) { /* OK netmask */ return true; } @@ -235,7 +237,8 @@ static bool spdk_iscsi_tgt_node_visible(struct spdk_iscsi_tgt_node *target, const char *iqn) { struct spdk_iscsi_init_grp *igp; - int i, j; + struct spdk_iscsi_initiator_name *iname; + int i; if (target == NULL || iqn == NULL) return false; @@ -243,15 +246,15 @@ spdk_iscsi_tgt_node_visible(struct spdk_iscsi_tgt_node *target, const char *iqn) for (i = 0; i < target->maxmap; i++) { /* iqn is initiator group? */ igp = target->map[i].ig; - for (j = 0; j < igp->ninitiators; j++) { - if (igp->initiators[j][0] == '!' - && (strcasecmp(&igp->initiators[j][1], "ALL") == 0 - || strcasecmp(&igp->initiators[j][1], iqn) == 0)) { + TAILQ_FOREACH(iname, &igp->initiator_head, tailq) { + if ((iname->name[0] == '!') + && (strcasecmp(&iname->name[1], "ALL") == 0 + || strcasecmp(&iname->name[1], iqn) == 0)) { /* NG */ return false; } - if (strcasecmp(igp->initiators[j], "ALL") == 0 - || strcasecmp(igp->initiators[j], iqn) == 0) { + if (strcasecmp(iname->name, "ALL") == 0 + || strcasecmp(iname->name, iqn) == 0) { /* OK iqn, no check addr */ return true; } diff --git a/test/unit/lib/iscsi/init_grp.c/init_grp_ut.c b/test/unit/lib/iscsi/init_grp.c/init_grp_ut.c index 3fb20e876..56c2d4ea4 100644 --- a/test/unit/lib/iscsi/init_grp.c/init_grp_ut.c +++ b/test/unit/lib/iscsi/init_grp.c/init_grp_ut.c @@ -100,6 +100,283 @@ create_from_config_file_cases(void) spdk_conf_free(config); } + +static void +create_initiator_group_success_case(void) +{ + struct spdk_iscsi_init_grp *ig; + + ig = spdk_iscsi_init_grp_create(1); + CU_ASSERT(ig != NULL); + + spdk_iscsi_init_grp_destroy(ig); +} + +static void +find_initiator_group_success_case(void) +{ + struct spdk_iscsi_init_grp *ig; + + ig = spdk_iscsi_init_grp_create(1); + CU_ASSERT(ig != NULL); + + spdk_iscsi_init_grp_register(ig); + + ig = spdk_iscsi_init_grp_find_by_tag(1); + CU_ASSERT(ig != NULL); + + spdk_initiator_group_unregister(ig); + spdk_iscsi_init_grp_destroy(ig); + + ig = spdk_iscsi_init_grp_find_by_tag(1); + CU_ASSERT(ig == NULL); +} + +static void +create_initiator_group_fail_case(void) +{ + struct spdk_iscsi_init_grp *ig; + + ig = spdk_iscsi_init_grp_create(1); + CU_ASSERT(ig != NULL); + + spdk_iscsi_init_grp_register(ig); + + ig = spdk_iscsi_init_grp_create(1); + CU_ASSERT(ig == NULL); + + ig = spdk_iscsi_init_grp_find_by_tag(1); + CU_ASSERT(ig != NULL); + + spdk_initiator_group_unregister(ig); + spdk_iscsi_init_grp_destroy(ig); + + ig = spdk_iscsi_init_grp_find_by_tag(1); + CU_ASSERT(ig == NULL); +} + +static void +add_initiator_name_success_case(void) +{ + int rc; + struct spdk_iscsi_init_grp *ig; + struct spdk_iscsi_initiator_name *iname; + char *name1 = "iqn.2017-10.spdk.io:0001"; + char *name2 = "iqn.2017-10.spdk.io:0002"; + + ig = spdk_iscsi_init_grp_create(1); + CU_ASSERT(ig != NULL); + + /* add two different names to the empty name list */ + rc = spdk_iscsi_init_grp_add_initiator(ig, name1); + CU_ASSERT(rc == 0); + + rc = spdk_iscsi_init_grp_add_initiator(ig, name2); + CU_ASSERT(rc == 0); + + /* check if two names are added correctly. */ + iname = spdk_iscsi_init_grp_find_initiator(ig, name1); + CU_ASSERT(iname != NULL); + + iname = spdk_iscsi_init_grp_find_initiator(ig, name2); + CU_ASSERT(iname != NULL); + + /* restore the initial state */ + rc = spdk_iscsi_init_grp_delete_initiator(ig, name1); + CU_ASSERT(rc == 0); + + iname = spdk_iscsi_init_grp_find_initiator(ig, name1); + CU_ASSERT(iname == NULL); + + rc = spdk_iscsi_init_grp_delete_initiator(ig, name2); + CU_ASSERT(rc == 0); + + iname = spdk_iscsi_init_grp_find_initiator(ig, name2); + CU_ASSERT(iname == NULL); + + spdk_iscsi_init_grp_destroy(ig); +} + +static void +add_initiator_name_fail_case(void) +{ + int rc; + struct spdk_iscsi_init_grp *ig; + struct spdk_iscsi_initiator_name *iname; + char *name1 = "iqn.2017-10.spdk.io:0001"; + + ig = spdk_iscsi_init_grp_create(1); + CU_ASSERT(ig != NULL); + + /* add an name to the full name list */ + ig->ninitiators = MAX_INITIATOR; + + rc = spdk_iscsi_init_grp_add_initiator(ig, name1); + CU_ASSERT(rc != 0); + + ig->ninitiators = 0; + + /* add the same name to the name list twice */ + rc = spdk_iscsi_init_grp_add_initiator(ig, name1); + CU_ASSERT(rc == 0); + + rc = spdk_iscsi_init_grp_add_initiator(ig, name1); + CU_ASSERT(rc != 0); + + /* restore the initial state */ + rc = spdk_iscsi_init_grp_delete_initiator(ig, name1); + CU_ASSERT(rc == 0); + + iname = spdk_iscsi_init_grp_find_initiator(ig, name1); + CU_ASSERT(iname == NULL); + + spdk_iscsi_init_grp_destroy(ig); +} + +static void +delete_all_initiator_names_success_case(void) +{ + int rc; + struct spdk_iscsi_init_grp *ig; + struct spdk_iscsi_initiator_name *iname; + char *name1 = "iqn.2017-10.spdk.io:0001"; + char *name2 = "iqn.2017-10.spdk.io:0002"; + + ig = spdk_iscsi_init_grp_create(1); + CU_ASSERT(ig != NULL); + + /* add two different names to the empty name list */ + rc = spdk_iscsi_init_grp_add_initiator(ig, name1); + CU_ASSERT(rc == 0); + + rc = spdk_iscsi_init_grp_add_initiator(ig, name2); + CU_ASSERT(rc == 0); + + /* delete all initiator names */ + spdk_iscsi_init_grp_delete_all_initiators(ig); + + /* check if two names are deleted correctly. */ + iname = spdk_iscsi_init_grp_find_initiator(ig, name1); + CU_ASSERT(iname == NULL); + + iname = spdk_iscsi_init_grp_find_initiator(ig, name2); + CU_ASSERT(iname == NULL); + + /* restore the initial state */ + spdk_iscsi_init_grp_destroy(ig); +} + +static void +add_netmask_success_case(void) +{ + int rc; + struct spdk_iscsi_init_grp *ig; + struct spdk_iscsi_initiator_netmask *imask; + char *netmask1 = "192.168.2.0"; + char *netmask2 = "192.168.2.1"; + + ig = spdk_iscsi_init_grp_create(1); + CU_ASSERT(ig != NULL); + + /* add two different netmasks to the empty netmask list */ + rc = spdk_iscsi_init_grp_add_netmask(ig, netmask1); + CU_ASSERT(rc == 0); + + rc = spdk_iscsi_init_grp_add_netmask(ig, netmask2); + CU_ASSERT(rc == 0); + + /* check if two netmasks are added correctly. */ + imask = spdk_iscsi_init_grp_find_netmask(ig, netmask1); + CU_ASSERT(imask != NULL); + + imask = spdk_iscsi_init_grp_find_netmask(ig, netmask2); + CU_ASSERT(imask != NULL); + + /* restore the initial state */ + rc = spdk_iscsi_init_grp_delete_netmask(ig, netmask1); + CU_ASSERT(rc == 0); + + imask = spdk_iscsi_init_grp_find_netmask(ig, netmask1); + CU_ASSERT(imask == NULL); + + rc = spdk_iscsi_init_grp_delete_netmask(ig, netmask2); + CU_ASSERT(rc == 0); + + imask = spdk_iscsi_init_grp_find_netmask(ig, netmask2); + CU_ASSERT(imask == NULL); + + spdk_iscsi_init_grp_destroy(ig); +} + +static void +add_netmask_fail_case(void) +{ + int rc; + struct spdk_iscsi_init_grp *ig; + struct spdk_iscsi_initiator_netmask *imask; + char *netmask1 = "192.168.2.0"; + + ig = spdk_iscsi_init_grp_create(1); + CU_ASSERT(ig != NULL); + + /* add an netmask to the full netmask list */ + ig->nnetmasks = MAX_NETMASK; + + rc = spdk_iscsi_init_grp_add_netmask(ig, netmask1); + CU_ASSERT(rc != 0); + + ig->nnetmasks = 0; + + /* add the same netmask to the netmask list twice */ + rc = spdk_iscsi_init_grp_add_netmask(ig, netmask1); + CU_ASSERT(rc == 0); + + rc = spdk_iscsi_init_grp_add_netmask(ig, netmask1); + CU_ASSERT(rc != 0); + + /* restore the initial state */ + rc = spdk_iscsi_init_grp_delete_netmask(ig, netmask1); + CU_ASSERT(rc == 0); + + imask = spdk_iscsi_init_grp_find_netmask(ig, netmask1); + CU_ASSERT(imask == NULL); + + spdk_iscsi_init_grp_destroy(ig); +} + +static void +delete_all_netmasks_success_case(void) +{ + int rc; + struct spdk_iscsi_init_grp *ig; + struct spdk_iscsi_initiator_netmask *imask; + char *netmask1 = "192.168.2.0"; + char *netmask2 = "192.168.2.1"; + + ig = spdk_iscsi_init_grp_create(1); + CU_ASSERT(ig != NULL); + + /* add two different netmasks to the empty netmask list */ + rc = spdk_iscsi_init_grp_add_netmask(ig, netmask1); + CU_ASSERT(rc == 0); + + rc = spdk_iscsi_init_grp_add_netmask(ig, netmask2); + CU_ASSERT(rc == 0); + + /* delete all netmasks */ + spdk_iscsi_init_grp_delete_all_netmasks(ig); + + /* check if two netmasks are deleted correctly. */ + imask = spdk_iscsi_init_grp_find_netmask(ig, netmask1); + CU_ASSERT(imask == NULL); + + imask = spdk_iscsi_init_grp_find_netmask(ig, netmask2); + CU_ASSERT(imask == NULL); + + /* restore the initial state */ + spdk_iscsi_init_grp_destroy(ig); +} + int main(int argc, char **argv) { @@ -126,6 +403,25 @@ main(int argc, char **argv) if ( CU_add_test(suite, "create from config file cases", create_from_config_file_cases) == NULL + || CU_add_test(suite, "create initiator group success case", + create_initiator_group_success_case) == NULL + || CU_add_test(suite, "find initiator group success case", + find_initiator_group_success_case) == NULL + || CU_add_test(suite, "create initiator group fail case", + create_initiator_group_fail_case) == NULL + || CU_add_test(suite, "add initiator name success case", + add_initiator_name_success_case) == NULL + || CU_add_test(suite, "add initiator name fail case", + add_initiator_name_fail_case) == NULL + || CU_add_test(suite, "delete all initiator names success case", + delete_all_initiator_names_success_case) == NULL + || CU_add_test(suite, "add initiator netmask success case", + add_netmask_success_case) == NULL + || CU_add_test(suite, "add initiator netmask fail case", + add_netmask_fail_case) == NULL + || CU_add_test(suite, "delete all initiator netmasks success case", + delete_all_netmasks_success_case) == NULL + ) { CU_cleanup_registry(); return CU_get_error(); 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 6abed3f25..e1687fad4 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 @@ -184,8 +184,8 @@ node_access_allowed(void) struct spdk_iscsi_init_grp ig; struct spdk_iscsi_conn conn; struct spdk_iscsi_portal portal; - char *initiators[] = {"iqn.2017-10.spdk.io:0001"}; - char *netmasks[] = {"192.168.2.0/24"}; + struct spdk_iscsi_initiator_name iname; + struct spdk_iscsi_initiator_netmask imask; char *iqn, *addr; bool result; @@ -198,10 +198,14 @@ node_access_allowed(void) ig.tag = 1; ig.ninitiators = 1; - ig.initiators = &initiators[0]; + iname.name = "iqn.2017-10.spdk.io:0001"; + TAILQ_INIT(&ig.initiator_head); + TAILQ_INSERT_TAIL(&ig.initiator_head, &iname, tailq); ig.nnetmasks = 1; - ig.netmasks = &netmasks[0]; + imask.mask = "192.168.2.0/24"; + TAILQ_INIT(&ig.netmask_head); + TAILQ_INSERT_TAIL(&ig.netmask_head, &imask, tailq); /* target initialization */ memset(&tgtnode, 0, sizeof(struct spdk_iscsi_tgt_node)); @@ -235,7 +239,7 @@ node_access_denied_by_empty_netmask(void) struct spdk_iscsi_init_grp ig; struct spdk_iscsi_conn conn; struct spdk_iscsi_portal portal; - char *initiators[] = {"iqn.2017-10.spdk.io:0001"}; + struct spdk_iscsi_initiator_name iname; char *iqn, *addr; bool result; @@ -248,10 +252,12 @@ node_access_denied_by_empty_netmask(void) ig.tag = 1; ig.ninitiators = 1; - ig.initiators = &initiators[0]; + iname.name = "iqn.2017-10.spdk.io:0001"; + TAILQ_INIT(&ig.initiator_head); + TAILQ_INSERT_TAIL(&ig.initiator_head, &iname, tailq); ig.nnetmasks = 0; - ig.netmasks = NULL; + TAILQ_INIT(&ig.netmask_head); /* target initialization */ memset(&tgtnode, 0, sizeof(struct spdk_iscsi_tgt_node));