From 6761c7d71a3fa7c6d5c718fafb3423f9e51ab261 Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Fri, 5 Jan 2024 14:42:11 +0100 Subject: [PATCH 1/5] nbft: Fix (struct nbft_info_subsystem_ns).num_hfis off-by-one The num_hfis field only reflected the number of Secondary HFI Associations, resulting in the last parsed HFI being ignored by users (nvme-cli). According to the NVM Express Boot Specification, Revision 1.0, the Primary HFI Descriptor Index in the Subsystem Namespace (SSNS) Descriptor contains this note: "If multiple HFIs are associated with this record, subsequent interfaces should be populated in the Secondary HFI Associations field." As both the primary and secondary HFIs are parsed into a single array, it makes sense to reflect the proper number of elements. Signed-off-by: Tomas Bzatek --- src/nvme/nbft.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/nvme/nbft.c b/src/nvme/nbft.c index 2c870880..06632323 100644 --- a/src/nvme/nbft.c +++ b/src/nvme/nbft.c @@ -274,6 +274,7 @@ static int read_ssns(struct nbft_info *nbft, ret = -EINVAL; goto fail; } + ssns->num_hfis = 1; for (i = 0; i < le16_to_cpu(raw_ssns->secondary_hfi_assoc_obj.length); i++) { ssns->hfis[i + 1] = hfi_from_index(nbft, ss_hfi_indexes[i]); if (ss_hfi_indexes[i] && !ssns->hfis[i + 1]) From fc919080448a3b9cdb1eaa0e65f17d5b45f9e58d Mon Sep 17 00:00:00 2001 From: Martin Wilck Date: Thu, 11 Jan 2024 11:02:11 +0100 Subject: [PATCH 2/5] nbft: avoid duplicate entries in ssns->hfis The NVMe boot specification does not disallow listing the primary HFI index again in the secondary HFI list, or listing the same index multiple times in the secondary HFI list. But such duplicate entries aren't helpful for consumers of this data. In the worst case, they might lead to confusion and misconfiguration. Suppress them. Signed-off-by: Martin Wilck --- src/nvme/nbft.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/nvme/nbft.c b/src/nvme/nbft.c index 06632323..f2ffc21e 100644 --- a/src/nvme/nbft.c +++ b/src/nvme/nbft.c @@ -276,6 +276,27 @@ static int read_ssns(struct nbft_info *nbft, } ssns->num_hfis = 1; for (i = 0; i < le16_to_cpu(raw_ssns->secondary_hfi_assoc_obj.length); i++) { + bool duplicate = false; + int j; + + for (j = 0; j < i; j++) { + if (ss_hfi_indexes[i] == ss_hfi_indexes[j]) { + duplicate = true; + break; + } + } + + if (!duplicate && + ss_hfi_indexes[i] == raw_ssns->primary_hfi_desc_index) + duplicate = true; + + if (duplicate) { + nvme_msg(NULL, LOG_DEBUG, + "file %s: SSNS %d skipping duplicate HFI index %d\n", + nbft->filename, ssns->index, ss_hfi_indexes[i]); + continue; + } + ssns->hfis[i + 1] = hfi_from_index(nbft, ss_hfi_indexes[i]); if (ss_hfi_indexes[i] && !ssns->hfis[i + 1]) nvme_msg(NULL, LOG_DEBUG, From 68afe6d9055025aa54c351bb131c30e0d66e6976 Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Fri, 5 Jan 2024 14:49:15 +0100 Subject: [PATCH 3/5] tests: Fix diffs output for duplicate HFI entries With commit "nbft: avoid duplicate entries in ssns->hfis" applied, nbft-dump will not see any duplicate HFI indices any more. Fix the reference output for generating the diffs. Signed-off-by: Martin Wilck Signed-off-by: Tomas Bzatek --- test/nbft/diffs/NBFT-auto-ipv6 | 1 - test/nbft/diffs/NBFT-dhcp-ipv4 | 1 - test/nbft/diffs/NBFT-dhcp-ipv6 | 1 - test/nbft/diffs/NBFT-rhpoc | 1 - test/nbft/diffs/NBFT-static-ipv4 | 1 - test/nbft/diffs/NBFT-static-ipv4-discovery | 1 - test/nbft/diffs/NBFT-static-ipv6 | 1 - 7 files changed, 7 deletions(-) diff --git a/test/nbft/diffs/NBFT-auto-ipv6 b/test/nbft/diffs/NBFT-auto-ipv6 index 32a8b607..83ee6430 100644 --- a/test/nbft/diffs/NBFT-auto-ipv6 +++ b/test/nbft/diffs/NBFT-auto-ipv6 @@ -23,7 +23,6 @@ hfi_list[0]->tcp_info.dhcp_override=0 subsystem_ns_list[0]->index=1 subsystem_ns_list[0]->num_hfis=1 subsystem_ns_list[0]->hfis[0]->index=1 -subsystem_ns_list[0]->hfis[1]->index=1 subsystem_ns_list[0]->transport=tcp subsystem_ns_list[0]->traddr=fd09:9a46:b5c1:1ff:5054:ff:fefd:9e66 subsystem_ns_list[0]->trsvcid=4420 diff --git a/test/nbft/diffs/NBFT-dhcp-ipv4 b/test/nbft/diffs/NBFT-dhcp-ipv4 index cb280d9a..067079d9 100644 --- a/test/nbft/diffs/NBFT-dhcp-ipv4 +++ b/test/nbft/diffs/NBFT-dhcp-ipv4 @@ -28,7 +28,6 @@ subsystem_ns_list[0]->index=1 subsystem_ns_list[0]->discovery->index=1 subsystem_ns_list[0]->num_hfis=1 subsystem_ns_list[0]->hfis[0]->index=1 -subsystem_ns_list[0]->hfis[1]->index=1 subsystem_ns_list[0]->transport=tcp subsystem_ns_list[0]->traddr=192.168.49.10 subsystem_ns_list[0]->trsvcid=4420 diff --git a/test/nbft/diffs/NBFT-dhcp-ipv6 b/test/nbft/diffs/NBFT-dhcp-ipv6 index b94cc394..11c974f6 100644 --- a/test/nbft/diffs/NBFT-dhcp-ipv6 +++ b/test/nbft/diffs/NBFT-dhcp-ipv6 @@ -23,7 +23,6 @@ hfi_list[0]->tcp_info.dhcp_override=1 subsystem_ns_list[0]->index=1 subsystem_ns_list[0]->num_hfis=1 subsystem_ns_list[0]->hfis[0]->index=1 -subsystem_ns_list[0]->hfis[1]->index=1 subsystem_ns_list[0]->transport=tcp subsystem_ns_list[0]->traddr=fddf:d:f:49::10 subsystem_ns_list[0]->trsvcid=4420 diff --git a/test/nbft/diffs/NBFT-rhpoc b/test/nbft/diffs/NBFT-rhpoc index d4b4ad84..d849b6e1 100644 --- a/test/nbft/diffs/NBFT-rhpoc +++ b/test/nbft/diffs/NBFT-rhpoc @@ -23,7 +23,6 @@ hfi_list[0]->tcp_info.dhcp_override=0 subsystem_ns_list[0]->index=1 subsystem_ns_list[0]->num_hfis=1 subsystem_ns_list[0]->hfis[0]->index=1 -subsystem_ns_list[0]->hfis[1]->index=1 subsystem_ns_list[0]->transport=tcp subsystem_ns_list[0]->traddr=192.168.101.20 subsystem_ns_list[0]->trsvcid=4420 diff --git a/test/nbft/diffs/NBFT-static-ipv4 b/test/nbft/diffs/NBFT-static-ipv4 index 715b30d2..a6f38597 100644 --- a/test/nbft/diffs/NBFT-static-ipv4 +++ b/test/nbft/diffs/NBFT-static-ipv4 @@ -23,7 +23,6 @@ hfi_list[0]->tcp_info.dhcp_override=0 subsystem_ns_list[0]->index=1 subsystem_ns_list[0]->num_hfis=1 subsystem_ns_list[0]->hfis[0]->index=1 -subsystem_ns_list[0]->hfis[1]->index=1 subsystem_ns_list[0]->transport=tcp subsystem_ns_list[0]->traddr=192.168.49.10 subsystem_ns_list[0]->trsvcid=4420 diff --git a/test/nbft/diffs/NBFT-static-ipv4-discovery b/test/nbft/diffs/NBFT-static-ipv4-discovery index 67881b6c..5bf0e46f 100644 --- a/test/nbft/diffs/NBFT-static-ipv4-discovery +++ b/test/nbft/diffs/NBFT-static-ipv4-discovery @@ -28,7 +28,6 @@ subsystem_ns_list[0]->index=1 subsystem_ns_list[0]->discovery->index=1 subsystem_ns_list[0]->num_hfis=1 subsystem_ns_list[0]->hfis[0]->index=1 -subsystem_ns_list[0]->hfis[1]->index=1 subsystem_ns_list[0]->transport=tcp subsystem_ns_list[0]->traddr=192.168.49.10 subsystem_ns_list[0]->trsvcid=4420 diff --git a/test/nbft/diffs/NBFT-static-ipv6 b/test/nbft/diffs/NBFT-static-ipv6 index a5b02c1d..c6ad844d 100644 --- a/test/nbft/diffs/NBFT-static-ipv6 +++ b/test/nbft/diffs/NBFT-static-ipv6 @@ -23,7 +23,6 @@ hfi_list[0]->tcp_info.dhcp_override=0 subsystem_ns_list[0]->index=1 subsystem_ns_list[0]->num_hfis=1 subsystem_ns_list[0]->hfis[0]->index=1 -subsystem_ns_list[0]->hfis[1]->index=1 subsystem_ns_list[0]->transport=tcp subsystem_ns_list[0]->traddr=fd09:9a46:b5c1:1fe::13f subsystem_ns_list[0]->trsvcid=4420 From 0bc1985b3e78383cd842968e2adc16d019e784f1 Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Fri, 5 Jan 2024 14:53:28 +0100 Subject: [PATCH 4/5] tests: Add sample NBFT table from Dell PowerEdge R760 Covered by the Python tests already, let's include this table in the other NBFT parser tests (which are all QEMU dumps). Signed-off-by: Tomas Bzatek --- test/nbft/diffs/NBFT-Dell.PowerEdge.R760 | 60 +++++++++++++++++++++++ test/nbft/meson.build | 1 + test/nbft/tables/NBFT-Dell.PowerEdge.R760 | 1 + 3 files changed, 62 insertions(+) create mode 100644 test/nbft/diffs/NBFT-Dell.PowerEdge.R760 create mode 120000 test/nbft/tables/NBFT-Dell.PowerEdge.R760 diff --git a/test/nbft/diffs/NBFT-Dell.PowerEdge.R760 b/test/nbft/diffs/NBFT-Dell.PowerEdge.R760 new file mode 100644 index 00000000..d7fab3f2 --- /dev/null +++ b/test/nbft/diffs/NBFT-Dell.PowerEdge.R760 @@ -0,0 +1,60 @@ +raw_nbft_size=1017 +host.id=44454c4c34010368038b2c04f313233 +host.nqn=nqn.1988-11.com.dell:PowerEdge.R760.1234567 +host.host_id_configured=1 +host.host_nqn_configured=1 +host.primary=0 +hfi_list[0]->index=1 +hfi_list[0]->transport=tcp +hfi_list[0]->tcp_info.pci_sbdf=16384 +hfi_list[0]->tcp_info.mac_addr=b02628e87ce +hfi_list[0]->tcp_info.vlan=0 +hfi_list[0]->tcp_info.ip_origin=82 +hfi_list[0]->tcp_info.ipaddr=100.71.245.232 +hfi_list[0]->tcp_info.subnet_mask_prefix=24 +hfi_list[0]->tcp_info.gateway_ipaddr=100.71.245.254 +hfi_list[0]->tcp_info.route_metric=500 +hfi_list[0]->tcp_info.primary_dns_ipaddr=100.64.0.5 +hfi_list[0]->tcp_info.secondary_dns_ipaddr=100.64.0.6 +hfi_list[0]->tcp_info.dhcp_server_ipaddr=100.71.245.254 +hfi_list[0]->tcp_info.host_name=(null) +hfi_list[0]->tcp_info.this_hfi_is_default_route=1 +hfi_list[0]->tcp_info.dhcp_override=1 +discovery_list[0]->index=1 +discovery_list[0]->hfi->index=1 +discovery_list[0]->uri=nvme+tcp://100.71.103.50:8009/ +discovery_list[0]->nqn=nqn.2014-08.org.nvmexpress.discovery +subsystem_ns_list[0]->index=1 +subsystem_ns_list[0]->discovery->index=1 +subsystem_ns_list[0]->num_hfis=1 +subsystem_ns_list[0]->hfis[0]->index=1 +subsystem_ns_list[0]->transport=tcp +subsystem_ns_list[0]->traddr=100.71.103.48 +subsystem_ns_list[0]->trsvcid=4420 +subsystem_ns_list[0]->subsys_port_id=0 +subsystem_ns_list[0]->nsid=148 +subsystem_ns_list[0]->nid_type=2 +subsystem_ns_list[0]->nid=c8244ed9c15f53b8ccf96802efca +subsystem_ns_list[0]->subsys_nqn=nqn.1988-11.com.dell:powerstore:00:2a64abf1c5b81F6C4549 +subsystem_ns_list[0]->pdu_header_digest_required=0 +subsystem_ns_list[0]->data_digest_required=0 +subsystem_ns_list[0]->controller_id=5 +subsystem_ns_list[0]->asqsz=0 +subsystem_ns_list[0]->dhcp_root_path_string=(null) +subsystem_ns_list[1]->index=2 +subsystem_ns_list[1]->discovery->index=1 +subsystem_ns_list[1]->num_hfis=1 +subsystem_ns_list[1]->hfis[0]->index=1 +subsystem_ns_list[1]->transport=tcp +subsystem_ns_list[1]->traddr=100.71.103.49 +subsystem_ns_list[1]->trsvcid=4420 +subsystem_ns_list[1]->subsys_port_id=0 +subsystem_ns_list[1]->nsid=148 +subsystem_ns_list[1]->nid_type=2 +subsystem_ns_list[1]->nid=c8244ed9c15f53b8ccf96802efca +subsystem_ns_list[1]->subsys_nqn=nqn.1988-11.com.dell:powerstore:00:2a64abf1c5b81F6C4549 +subsystem_ns_list[1]->pdu_header_digest_required=0 +subsystem_ns_list[1]->data_digest_required=0 +subsystem_ns_list[1]->controller_id=4166 +subsystem_ns_list[1]->asqsz=0 +subsystem_ns_list[1]->dhcp_root_path_string=(null)