nvmf: Add subsystem modes

Change-Id: I74f69eb10e4d8807a323f463775f4953fe0baee0
Signed-off-by: Cunyin Chang <cunyin.chang@intel.com>
This commit is contained in:
Cunyin Chang 2016-07-20 17:54:53 +08:00 committed by Daniel Verkamp
parent 861e78bf48
commit d439f4408a
4 changed files with 36 additions and 1 deletions

View File

@ -49,6 +49,13 @@
# Define an NVMf Subsystem.
# - NQN is required and must be unique.
# - Mode may be either "Direct" or "Virtual". Direct means that physical
# devices attached to the target will be presented to hosts as if they
# were directly attached to the host. No software emulation or command
# validation is performed. Virtual means that an NVMe controller is
# emulated in software and the namespaces it contains map to block devices
# on the target system. These block devices do not need to be NVMe devices.
# Only Direct mode is currently supported.
# - Between 1 and 255 Listen directives are allowed. This defines
# the addresses on which new connections may be accepted. The format
# is Listen <type> <address> where type currently can only be RDMA.
@ -58,6 +65,7 @@
# - Exactly 1 Controller directive.
[Subsystem1]
NQN nqn.2016-06.io.spdk:cnode1
Mode Direct
Listen RDMA 15.15.15.2:4420
Host nqn.2016-06.io.spdk:init
Controller Nvme0
@ -65,6 +73,7 @@
# Multiple subsystems are allowed.
[Subsystem2]
NQN nqn.2016-06.io.spdk:cnode2
Mode Direct
Listen RDMA 192.168.2.21:4420
Host nqn.2016-06.io.spdk:init
Controller Nvme1

View File

@ -310,7 +310,7 @@ spdk_nvmf_allocate_lcore(uint64_t mask, uint32_t lcore)
static int
spdk_nvmf_parse_subsystem(struct spdk_conf_section *sp)
{
const char *val, *nqn;
const char *val, *nqn, *mode;
struct spdk_nvmf_subsystem *subsystem;
struct spdk_nvmf_ctrlr *nvmf_ctrlr;
int i, ret;
@ -341,6 +341,25 @@ spdk_nvmf_parse_subsystem(struct spdk_conf_section *sp)
return -1;
}
mode = spdk_conf_section_get_val(sp, "Mode");
if (mode == NULL) {
nvmf_delete_subsystem(subsystem);
SPDK_ERRLOG("No Mode specified for Subsystem %d\n", sp->num);
return -1;
}
if (strcasecmp(mode, "Direct") == 0) {
subsystem->mode = NVMF_SUBSYSTEM_MODE_DIRECT;
} else if (strcasecmp(mode, "Virtual") == 0) {
nvmf_delete_subsystem(subsystem);
SPDK_ERRLOG("Virtual Subsystems are not yet supported.\n");
return -1;
} else {
nvmf_delete_subsystem(subsystem);
SPDK_ERRLOG("Invalid Subsystem mode: %s\n", mode);
return -1;
}
/* Parse Listen sections */
for (i = 0; i < MAX_LISTEN_ADDRESSES; i++) {
char *transport_name, *listen_addr;

View File

@ -42,6 +42,11 @@ struct spdk_nvmf_conn;
#define MAX_NQN_SIZE 255
enum spdk_nvmf_subsystem_mode {
NVMF_SUBSYSTEM_MODE_DIRECT = 0,
NVMF_SUBSYSTEM_MODE_VIRTUAL = 1,
};
struct spdk_nvmf_listen_addr {
char *traddr;
char *trsvc; /* TODO: Change to trsvcid */
@ -62,6 +67,7 @@ struct spdk_nvmf_host {
struct spdk_nvmf_subsystem {
uint16_t num;
char subnqn[MAX_NQN_SIZE];
enum spdk_nvmf_subsystem_mode mode;
enum spdk_nvmf_subtype subtype;
struct nvmf_session *session;
struct spdk_nvme_ctrlr *ctrlr;

View File

@ -11,5 +11,6 @@
[Subsystem1]
NQN "nqn.2016-06.io.spdk:cnode1"
Mode Direct
Listen RDMA 192.168.100.8:4420
Controller Nvme0