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 <shuhei.matsumoto.xt@hitachi.com> Reviewed-on: https://review.gerrithub.io/379932 Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Ziye Yang <optimistyzy@gmail.com> Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com> Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
This commit is contained in:
parent
92ef1a64ec
commit
b8705bf48c
@ -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:
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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));
|
||||
|
Loading…
Reference in New Issue
Block a user