#define TEST_FD 0xFD
+static void arbitrary_ascii_string(size_t max_len, char *str, char *log_str)
+{
+ size_t len;
+ size_t i;
+
+ len = arbitrary_range(max_len + 1);
+ for (i = 0; i < len; i++) {
+ /*
+ * ASCII strings shall contain only code values 20h through 7Eh.
+ * Exclude 20h (space) because it ends the string.
+ */
+ str[i] = log_str[i] = arbitrary_range(0x7E - 0x20) + 0x20 + 1;
+ }
+ for (i = len; i < max_len; i++) {
+ str[i] = '\0';
+ log_str[i] = ' ';
+ }
+}
+
+static void arbitrary_entry(struct nvmf_disc_log_entry *entry,
+ struct nvmf_disc_log_entry *log_entry)
+{
+ arbitrary(entry, sizeof(*entry));
+ memcpy(log_entry, entry, sizeof(*entry));
+ arbitrary_ascii_string(
+ sizeof(entry->trsvcid), entry->trsvcid, log_entry->trsvcid);
+ arbitrary_ascii_string(
+ sizeof(entry->traddr), entry->traddr, log_entry->traddr);
+}
+
+static void arbitrary_entries(size_t len,
+ struct nvmf_disc_log_entry *entries,
+ struct nvmf_disc_log_entry *log_entries)
+{
+ size_t i;
+
+ for (i = 0; i < len; i++)
+ arbitrary_entry(&entries[i], &log_entries[i]);
+}
+
static void test_no_entries(nvme_ctrl_t c)
{
struct nvmf_discovery_log header = {};
static void test_four_entries(nvme_ctrl_t c)
{
- struct nvmf_disc_log_entry entries[4];
- struct nvmf_discovery_log header = {
- .numrec = cpu_to_le64(ARRAY_SIZE(entries)),
- };
+ size_t num_entries = 4;
+ struct nvmf_disc_log_entry entries[num_entries];
+ struct nvmf_disc_log_entry log_entries[num_entries];
+ struct nvmf_discovery_log header = {.numrec = cpu_to_le64(num_entries)};
/*
* All 4 entries should be fetched at once
* followed by the header again (to ensure genctr hasn't changed)
| 1 << 15 /* RAE */
| NVME_LOG_LID_DISCOVER, /* LID */
.cdw12 = sizeof(header), /* LPOL */
- .out_data = entries,
+ .out_data = log_entries,
},
{
.opcode = nvme_admin_get_log_page,
};
struct nvmf_discovery_log *log = NULL;
- arbitrary(entries, sizeof(entries));
+ arbitrary_entries(num_entries, entries, log_entries);
set_mock_admin_cmds(mock_admin_cmds, ARRAY_SIZE(mock_admin_cmds));
check(nvmf_get_discovery_log(c, &log, 1) == 0, "discovery failed: %m");
end_mock_cmds();
static void test_five_entries(nvme_ctrl_t c)
{
- struct nvmf_disc_log_entry entries[5];
+ size_t num_entries = 5;
+ struct nvmf_disc_log_entry entries[num_entries];
+ struct nvmf_disc_log_entry log_entries[num_entries];
size_t first_entries = 4;
size_t first_data_len = first_entries * sizeof(*entries);
- size_t second_entries = ARRAY_SIZE(entries) - first_entries;
+ size_t second_entries = num_entries - first_entries;
size_t second_data_len = second_entries * sizeof(*entries);
- struct nvmf_discovery_log header = {
- .numrec = cpu_to_le64(ARRAY_SIZE(entries)),
- };
+ struct nvmf_discovery_log header = {.numrec = cpu_to_le64(num_entries)};
/*
* The first 4 entries (4 KB) are fetched together,
* followed by last entry separately.
| 1 << 15 /* RAE */
| NVME_LOG_LID_DISCOVER, /* LID */
.cdw12 = sizeof(header), /* LPOL */
- .out_data = entries,
+ .out_data = log_entries,
},
{
.opcode = nvme_admin_get_log_page,
| 1 << 15 /* RAE */
| NVME_LOG_LID_DISCOVER, /* LID */
.cdw12 = sizeof(header) + first_data_len, /* LPOL */
- .out_data = entries + first_entries,
+ .out_data = log_entries + first_entries,
},
{
.opcode = nvme_admin_get_log_page,
};
struct nvmf_discovery_log *log = NULL;
- arbitrary(entries, sizeof(entries));
+ arbitrary_entries(num_entries, entries, log_entries);
set_mock_admin_cmds(mock_admin_cmds, ARRAY_SIZE(mock_admin_cmds));
check(nvmf_get_discovery_log(c, &log, 1) == 0, "discovery failed: %m");
end_mock_cmds();
struct nvmf_discovery_log header1 = {
.numrec = cpu_to_le64(ARRAY_SIZE(entries1)),
};
- struct nvmf_disc_log_entry entries2[2];
+ size_t num_entries2 = 2;
+ struct nvmf_disc_log_entry entries2[num_entries2];
+ struct nvmf_disc_log_entry log_entries2[num_entries2];
struct nvmf_discovery_log header2 = {
.genctr = cpu_to_le64(1),
- .numrec = cpu_to_le64(ARRAY_SIZE(entries2)),
+ .numrec = cpu_to_le64(num_entries2),
};
/*
* genctr changes after the entries are fetched the first time,
| 1 << 15 /* RAE */
| NVME_LOG_LID_DISCOVER, /* LID */
.cdw12 = sizeof(header2), /* LPOL */
- .out_data = entries2,
+ .out_data = log_entries2,
},
{
.opcode = nvme_admin_get_log_page,
struct nvmf_discovery_log *log = NULL;
arbitrary(entries1, sizeof(entries1));
- arbitrary(entries2, sizeof(entries2));
+ arbitrary_entries(num_entries2, entries2, log_entries2);
set_mock_admin_cmds(mock_admin_cmds, ARRAY_SIZE(mock_admin_cmds));
check(nvmf_get_discovery_log(c, &log, 2) == 0, "discovery failed: %m");
end_mock_cmds();