From eb79fd2d0b5d94b19931bd358c71e9ed9547e22b Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Tue, 11 Apr 2023 18:04:55 +0200 Subject: [PATCH] nbft: Add a simple unit test A simple table dump utility, a set of real ACPI NBFT table files and corresponding set of reference dumps, compared against each other as part of the meson test run. Please check the README file for details. Signed-off-by: Tomas Bzatek --- test/meson.build | 2 + test/nbft/README | 17 +++ test/nbft/diffs/NBFT-auto-ipv6 | 39 +++++++ test/nbft/diffs/NBFT-dhcp-ipv4 | 44 +++++++ test/nbft/diffs/NBFT-dhcp-ipv6 | 39 +++++++ test/nbft/diffs/NBFT-rhpoc | 39 +++++++ test/nbft/diffs/NBFT-static-ipv4 | 39 +++++++ test/nbft/diffs/NBFT-static-ipv4-discovery | 44 +++++++ test/nbft/diffs/NBFT-static-ipv6 | 39 +++++++ test/nbft/gen-nbft-diffs.sh.in | 5 + test/nbft/meson.build | 83 ++++++++++++++ test/nbft/nbft-dump-diff.sh.in | 8 ++ test/nbft/nbft-dump.c | 121 ++++++++++++++++++++ test/nbft/tables/NBFT-auto-ipv6 | Bin 0 -> 721 bytes test/nbft/tables/NBFT-dhcp-ipv4 | Bin 0 -> 825 bytes test/nbft/tables/NBFT-dhcp-ipv6 | Bin 0 -> 725 bytes test/nbft/tables/NBFT-rhpoc | Bin 0 -> 724 bytes test/nbft/tables/NBFT-static-ipv4 | Bin 0 -> 725 bytes test/nbft/tables/NBFT-static-ipv4-discovery | Bin 0 -> 825 bytes test/nbft/tables/NBFT-static-ipv6 | Bin 0 -> 721 bytes test/nbft/tables_bad/NBFT-bad-oldspec | Bin 0 -> 1103 bytes test/nbft/tables_bad/NBFT-random-noise | Bin 0 -> 512 bytes 22 files changed, 519 insertions(+) create mode 100644 test/nbft/README create mode 100644 test/nbft/diffs/NBFT-auto-ipv6 create mode 100644 test/nbft/diffs/NBFT-dhcp-ipv4 create mode 100644 test/nbft/diffs/NBFT-dhcp-ipv6 create mode 100644 test/nbft/diffs/NBFT-rhpoc create mode 100644 test/nbft/diffs/NBFT-static-ipv4 create mode 100644 test/nbft/diffs/NBFT-static-ipv4-discovery create mode 100644 test/nbft/diffs/NBFT-static-ipv6 create mode 100755 test/nbft/gen-nbft-diffs.sh.in create mode 100644 test/nbft/meson.build create mode 100755 test/nbft/nbft-dump-diff.sh.in create mode 100644 test/nbft/nbft-dump.c create mode 100644 test/nbft/tables/NBFT-auto-ipv6 create mode 100644 test/nbft/tables/NBFT-dhcp-ipv4 create mode 100644 test/nbft/tables/NBFT-dhcp-ipv6 create mode 100644 test/nbft/tables/NBFT-rhpoc create mode 100644 test/nbft/tables/NBFT-static-ipv4 create mode 100644 test/nbft/tables/NBFT-static-ipv4-discovery create mode 100644 test/nbft/tables/NBFT-static-ipv6 create mode 100644 test/nbft/tables_bad/NBFT-bad-oldspec create mode 100644 test/nbft/tables_bad/NBFT-random-noise diff --git a/test/meson.build b/test/meson.build index d90f835e..9b2657d2 100644 --- a/test/meson.build +++ b/test/meson.build @@ -65,3 +65,5 @@ uuid = executable( ) test('uuid', uuid) + +subdir('nbft') diff --git a/test/nbft/README b/test/nbft/README new file mode 100644 index 00000000..0f252a53 --- /dev/null +++ b/test/nbft/README @@ -0,0 +1,17 @@ +This is a simple testcase to verify the NBFT parser output over a set +of provided ACPI NBFT tables. + +The 'nbft-dump' test utility is a simple tool to print out all elements +and nested arrays of the nbft_info structs, bearing only minimal logic. + +The 'tables' directory contains sample binary files taken from +/sys/firmware/acpi/tables. The 'tables_bad' then contains experiments, older +table revisions or malformed data to test the parser error path. + +The "diffs" directory contains reference output generated by the 'nbft-dump' +utility that is being compared against actual testcase run output. Everytime +'nbft-dump.c' is modified these reference output files need to be regenerated +by calling `ninja -C .build nbft-diffs` over the configured meson project. + +The tests are typically ran as part of the standard `meson test -C .build` +invocation. diff --git a/test/nbft/diffs/NBFT-auto-ipv6 b/test/nbft/diffs/NBFT-auto-ipv6 new file mode 100644 index 00000000..32a8b607 --- /dev/null +++ b/test/nbft/diffs/NBFT-auto-ipv6 @@ -0,0 +1,39 @@ +raw_nbft_size=721 +host.id=1ee8b170eb4c864fb7957d179e201a +host.nqn=nqn.2014-08.org.nvmexpress:uuid:70b1e81e-4ceb-4f86-b709-57d1079e201a +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=512 +hfi_list[0]->tcp_info.mac_addr=525409e201a +hfi_list[0]->tcp_info.vlan=0 +hfi_list[0]->tcp_info.ip_origin=1 +hfi_list[0]->tcp_info.ipaddr=fd09:9a46:b5c1:1ff:5054:ff:fe9e:201a +hfi_list[0]->tcp_info.subnet_mask_prefix=64 +hfi_list[0]->tcp_info.gateway_ipaddr=:: +hfi_list[0]->tcp_info.route_metric=0 +hfi_list[0]->tcp_info.primary_dns_ipaddr=:: +hfi_list[0]->tcp_info.secondary_dns_ipaddr=:: +hfi_list[0]->tcp_info.dhcp_server_ipaddr= +hfi_list[0]->tcp_info.host_name=nvmepoc-sles15-sp5 +hfi_list[0]->tcp_info.this_hfi_is_default_route=1 +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 +subsystem_ns_list[0]->subsys_port_id=0 +subsystem_ns_list[0]->nsid=1 +subsystem_ns_list[0]->nid_type=3 +subsystem_ns_list[0]->nid=848f4dc06d394968bf180569b8eea97 +subsystem_ns_list[0]->subsys_nqn=nqn.2022-12.de.suse.mwilck:zeus.vagrant-nvmet.subsys04 +subsystem_ns_list[0]->pdu_header_digest_required=0 +subsystem_ns_list[0]->data_digest_required=0 +subsystem_ns_list[0]->controller_id=1 +subsystem_ns_list[0]->asqsz=0 +subsystem_ns_list[0]->dhcp_root_path_string=(null) diff --git a/test/nbft/diffs/NBFT-dhcp-ipv4 b/test/nbft/diffs/NBFT-dhcp-ipv4 new file mode 100644 index 00000000..cb280d9a --- /dev/null +++ b/test/nbft/diffs/NBFT-dhcp-ipv4 @@ -0,0 +1,44 @@ +raw_nbft_size=825 +host.id=e359b7a15d37747b3cc1754b8b819b9 +host.nqn=nqn.2014-08.org.nvmexpress:uuid:a1b759e3-035d-4777-b3cc-1754b8b819b9 +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=8 +hfi_list[0]->tcp_info.mac_addr=52540b819b9 +hfi_list[0]->tcp_info.vlan=0 +hfi_list[0]->tcp_info.ip_origin=3 +hfi_list[0]->tcp_info.ipaddr=192.168.49.155 +hfi_list[0]->tcp_info.subnet_mask_prefix=24 +hfi_list[0]->tcp_info.gateway_ipaddr=0.0.0.0 +hfi_list[0]->tcp_info.route_metric=0 +hfi_list[0]->tcp_info.primary_dns_ipaddr=192.168.49.1 +hfi_list[0]->tcp_info.secondary_dns_ipaddr=0.0.0.0 +hfi_list[0]->tcp_info.dhcp_server_ipaddr=192.168.49.1 +hfi_list[0]->tcp_info.host_name=nvmeof-sles +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://192.168.49.10:4420/ +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]->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 +subsystem_ns_list[0]->subsys_port_id=0 +subsystem_ns_list[0]->nsid=1 +subsystem_ns_list[0]->nid_type=3 +subsystem_ns_list[0]->nid=df669a88bd6f4dd68a505f97eb55c835 +subsystem_ns_list[0]->subsys_nqn=nqn.2022-12.org.nvmexpress.boot.poc:bremer.vagrant-nvmet.subsys02 +subsystem_ns_list[0]->pdu_header_digest_required=0 +subsystem_ns_list[0]->data_digest_required=0 +subsystem_ns_list[0]->controller_id=7 +subsystem_ns_list[0]->asqsz=0 +subsystem_ns_list[0]->dhcp_root_path_string=(null) diff --git a/test/nbft/diffs/NBFT-dhcp-ipv6 b/test/nbft/diffs/NBFT-dhcp-ipv6 new file mode 100644 index 00000000..b94cc394 --- /dev/null +++ b/test/nbft/diffs/NBFT-dhcp-ipv6 @@ -0,0 +1,39 @@ +raw_nbft_size=725 +host.id=e359b7a15d37747b3cc1754b8b819b9 +host.nqn=nqn.2014-08.org.nvmexpress:uuid:a1b759e3-035d-4777-b3cc-1754b8b819b9 +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=8 +hfi_list[0]->tcp_info.mac_addr=52540b819b9 +hfi_list[0]->tcp_info.vlan=0 +hfi_list[0]->tcp_info.ip_origin=3 +hfi_list[0]->tcp_info.ipaddr=fddf:d:f:49::eb +hfi_list[0]->tcp_info.subnet_mask_prefix=64 +hfi_list[0]->tcp_info.gateway_ipaddr=:: +hfi_list[0]->tcp_info.route_metric=0 +hfi_list[0]->tcp_info.primary_dns_ipaddr=:: +hfi_list[0]->tcp_info.secondary_dns_ipaddr=:: +hfi_list[0]->tcp_info.dhcp_server_ipaddr=:: +hfi_list[0]->tcp_info.host_name=nvmeof-sles +hfi_list[0]->tcp_info.this_hfi_is_default_route=1 +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 +subsystem_ns_list[0]->subsys_port_id=0 +subsystem_ns_list[0]->nsid=1 +subsystem_ns_list[0]->nid_type=3 +subsystem_ns_list[0]->nid=df669a88bd6f4dd68a505f97eb55c835 +subsystem_ns_list[0]->subsys_nqn=nqn.2022-12.org.nvmexpress.boot.poc:bremer.vagrant-nvmet.subsys02 +subsystem_ns_list[0]->pdu_header_digest_required=0 +subsystem_ns_list[0]->data_digest_required=0 +subsystem_ns_list[0]->controller_id=34 +subsystem_ns_list[0]->asqsz=0 +subsystem_ns_list[0]->dhcp_root_path_string=(null) diff --git a/test/nbft/diffs/NBFT-rhpoc b/test/nbft/diffs/NBFT-rhpoc new file mode 100644 index 00000000..d4b4ad84 --- /dev/null +++ b/test/nbft/diffs/NBFT-rhpoc @@ -0,0 +1,39 @@ +raw_nbft_size=724 +host.id=b4bb164e7f9be448c7f77d8b4fc9f39 +host.nqn=nqn.2014-08.org.nvmexpress:uuid:f8131bac-cdef-4165-866b-5998c1e67890 +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=40 +hfi_list[0]->tcp_info.mac_addr=eaebd3588958 +hfi_list[0]->tcp_info.vlan=0 +hfi_list[0]->tcp_info.ip_origin=1 +hfi_list[0]->tcp_info.ipaddr=192.168.101.30 +hfi_list[0]->tcp_info.subnet_mask_prefix=24 +hfi_list[0]->tcp_info.gateway_ipaddr=0.0.0.0 +hfi_list[0]->tcp_info.route_metric=0 +hfi_list[0]->tcp_info.primary_dns_ipaddr=0.0.0.0 +hfi_list[0]->tcp_info.secondary_dns_ipaddr=0.0.0.0 +hfi_list[0]->tcp_info.dhcp_server_ipaddr= +hfi_list[0]->tcp_info.host_name=host-vm +hfi_list[0]->tcp_info.this_hfi_is_default_route=1 +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 +subsystem_ns_list[0]->subsys_port_id=0 +subsystem_ns_list[0]->nsid=1 +subsystem_ns_list[0]->nid_type=3 +subsystem_ns_list[0]->nid=bee9c2b7176144b5a4e6f69498a94b +subsystem_ns_list[0]->subsys_nqn=nqn.2014-08.org.nvmexpress:uuid:0c468c4d-a385-47e0-8299-6e95051277db +subsystem_ns_list[0]->pdu_header_digest_required=0 +subsystem_ns_list[0]->data_digest_required=0 +subsystem_ns_list[0]->controller_id=12 +subsystem_ns_list[0]->asqsz=0 +subsystem_ns_list[0]->dhcp_root_path_string=(null) diff --git a/test/nbft/diffs/NBFT-static-ipv4 b/test/nbft/diffs/NBFT-static-ipv4 new file mode 100644 index 00000000..715b30d2 --- /dev/null +++ b/test/nbft/diffs/NBFT-static-ipv4 @@ -0,0 +1,39 @@ +raw_nbft_size=725 +host.id=e359b7a15d37747b3cc1754b8b819b9 +host.nqn=nqn.2014-08.org.nvmexpress:uuid:a1b759e3-035d-4777-b3cc-1754b8b819b9 +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=8 +hfi_list[0]->tcp_info.mac_addr=52540b819b9 +hfi_list[0]->tcp_info.vlan=0 +hfi_list[0]->tcp_info.ip_origin=1 +hfi_list[0]->tcp_info.ipaddr=192.168.49.50 +hfi_list[0]->tcp_info.subnet_mask_prefix=24 +hfi_list[0]->tcp_info.gateway_ipaddr=0.0.0.0 +hfi_list[0]->tcp_info.route_metric=0 +hfi_list[0]->tcp_info.primary_dns_ipaddr=0.0.0.0 +hfi_list[0]->tcp_info.secondary_dns_ipaddr=0.0.0.0 +hfi_list[0]->tcp_info.dhcp_server_ipaddr= +hfi_list[0]->tcp_info.host_name=nvmeof-sles +hfi_list[0]->tcp_info.this_hfi_is_default_route=1 +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 +subsystem_ns_list[0]->subsys_port_id=0 +subsystem_ns_list[0]->nsid=1 +subsystem_ns_list[0]->nid_type=3 +subsystem_ns_list[0]->nid=df669a88bd6f4dd68a505f97eb55c835 +subsystem_ns_list[0]->subsys_nqn=nqn.2022-12.org.nvmexpress.boot.poc:bremer.vagrant-nvmet.subsys02 +subsystem_ns_list[0]->pdu_header_digest_required=0 +subsystem_ns_list[0]->data_digest_required=0 +subsystem_ns_list[0]->controller_id=38 +subsystem_ns_list[0]->asqsz=0 +subsystem_ns_list[0]->dhcp_root_path_string=(null) diff --git a/test/nbft/diffs/NBFT-static-ipv4-discovery b/test/nbft/diffs/NBFT-static-ipv4-discovery new file mode 100644 index 00000000..67881b6c --- /dev/null +++ b/test/nbft/diffs/NBFT-static-ipv4-discovery @@ -0,0 +1,44 @@ +raw_nbft_size=825 +host.id=e359b7a15d37747b3cc1754b8b819b9 +host.nqn=nqn.2014-08.org.nvmexpress:uuid:a1b759e3-035d-4777-b3cc-1754b8b819b9 +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=8 +hfi_list[0]->tcp_info.mac_addr=52540b819b9 +hfi_list[0]->tcp_info.vlan=0 +hfi_list[0]->tcp_info.ip_origin=1 +hfi_list[0]->tcp_info.ipaddr=192.168.49.50 +hfi_list[0]->tcp_info.subnet_mask_prefix=24 +hfi_list[0]->tcp_info.gateway_ipaddr=0.0.0.0 +hfi_list[0]->tcp_info.route_metric=0 +hfi_list[0]->tcp_info.primary_dns_ipaddr=0.0.0.0 +hfi_list[0]->tcp_info.secondary_dns_ipaddr=0.0.0.0 +hfi_list[0]->tcp_info.dhcp_server_ipaddr= +hfi_list[0]->tcp_info.host_name=nvmeof-sles +hfi_list[0]->tcp_info.this_hfi_is_default_route=1 +hfi_list[0]->tcp_info.dhcp_override=0 +discovery_list[0]->index=1 +discovery_list[0]->hfi->index=1 +discovery_list[0]->uri=nvme+tcp://192.168.49.10:4420/ +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]->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 +subsystem_ns_list[0]->subsys_port_id=0 +subsystem_ns_list[0]->nsid=1 +subsystem_ns_list[0]->nid_type=3 +subsystem_ns_list[0]->nid=df669a88bd6f4dd68a505f97eb55c835 +subsystem_ns_list[0]->subsys_nqn=nqn.2022-12.org.nvmexpress.boot.poc:bremer.vagrant-nvmet.subsys02 +subsystem_ns_list[0]->pdu_header_digest_required=0 +subsystem_ns_list[0]->data_digest_required=0 +subsystem_ns_list[0]->controller_id=13 +subsystem_ns_list[0]->asqsz=0 +subsystem_ns_list[0]->dhcp_root_path_string=(null) diff --git a/test/nbft/diffs/NBFT-static-ipv6 b/test/nbft/diffs/NBFT-static-ipv6 new file mode 100644 index 00000000..a5b02c1d --- /dev/null +++ b/test/nbft/diffs/NBFT-static-ipv6 @@ -0,0 +1,39 @@ +raw_nbft_size=721 +host.id=1ee8b170eb4c864fb7957d179e201a +host.nqn=nqn.2014-08.org.nvmexpress:uuid:70b1e81e-4ceb-4f86-b709-57d1079e201a +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=512 +hfi_list[0]->tcp_info.mac_addr=525409e201a +hfi_list[0]->tcp_info.vlan=0 +hfi_list[0]->tcp_info.ip_origin=1 +hfi_list[0]->tcp_info.ipaddr=fd09:9a46:b5c1:1fe::10 +hfi_list[0]->tcp_info.subnet_mask_prefix=64 +hfi_list[0]->tcp_info.gateway_ipaddr=:: +hfi_list[0]->tcp_info.route_metric=0 +hfi_list[0]->tcp_info.primary_dns_ipaddr=:: +hfi_list[0]->tcp_info.secondary_dns_ipaddr=:: +hfi_list[0]->tcp_info.dhcp_server_ipaddr= +hfi_list[0]->tcp_info.host_name=nvmepoc-sles15-sp5 +hfi_list[0]->tcp_info.this_hfi_is_default_route=1 +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 +subsystem_ns_list[0]->subsys_port_id=0 +subsystem_ns_list[0]->nsid=1 +subsystem_ns_list[0]->nid_type=3 +subsystem_ns_list[0]->nid=aab2c3c8444c47c599f23632e6364528 +subsystem_ns_list[0]->subsys_nqn=nqn.2022-12.de.suse.mwilck:zeus.vagrant-nvmet.subsys04 +subsystem_ns_list[0]->pdu_header_digest_required=0 +subsystem_ns_list[0]->data_digest_required=0 +subsystem_ns_list[0]->controller_id=9 +subsystem_ns_list[0]->asqsz=0 +subsystem_ns_list[0]->dhcp_root_path_string=(null) diff --git a/test/nbft/gen-nbft-diffs.sh.in b/test/nbft/gen-nbft-diffs.sh.in new file mode 100755 index 00000000..8b0b982a --- /dev/null +++ b/test/nbft/gen-nbft-diffs.sh.in @@ -0,0 +1,5 @@ +#!/bin/sh + +for T in "@TABLES_DIR@"/*; do + "@NBFT_DUMP_PATH@" "$T" > "@DIFF_DIR@/`basename $T`" +done diff --git a/test/nbft/meson.build b/test/nbft/meson.build new file mode 100644 index 00000000..67b2d951 --- /dev/null +++ b/test/nbft/meson.build @@ -0,0 +1,83 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +# +# This file is part of libnvme. +# Copyright (c) 2023 Red Hat Inc. +# +# Authors: Tomas Bzatek + +# NBFT parser tests over supplied NBFT ACPI table dumps + +tables_dir = 'tables' +tables_bad_dir = 'tables_bad' +diff_dir = 'diffs' + +tables = [ + 'NBFT-auto-ipv6', + 'NBFT-dhcp-ipv6', + 'NBFT-rhpoc', + 'NBFT-static-ipv4', + 'NBFT-static-ipv4-discovery', + 'NBFT-static-ipv6', +] + +tables_bad = [ + 'NBFT-bad-oldspec', + 'NBFT-random-noise', +] + +nbft_dump = executable( + 'nbft-dump', + ['nbft-dump.c'], + dependencies: libnvme_dep, + include_directories: [incdir, internal_incdir] +) + + +helper_data = configuration_data() +helper_data.set('NBFT_DUMP_PATH', nbft_dump.full_path()) +helper_data.set('TABLES_DIR', meson.current_source_dir()/tables_dir) +helper_data.set('DIFF_DIR', meson.current_source_dir()/diff_dir) + +dump_helper = configure_file( + input: 'nbft-dump-diff.sh.in', + output: '@BASENAME@', + configuration: helper_data +) + +gen_diffs_helper = configure_file( + input: 'gen-nbft-diffs.sh.in', + output: '@BASENAME@', + configuration: helper_data +) + + +run_target( + 'nbft-diffs', + depends: nbft_dump, + command: [gen_diffs_helper] +) + + +diffcmd = find_program( + 'diff', + required: false +) +if diffcmd.found() + foreach table: tables + test( + table, + dump_helper, + args: [files(tables_dir/table), + files(diff_dir/table)] + ) + endforeach +endif + +foreach table: tables_bad + test( + table, + nbft_dump, + args: [files(tables_bad_dir/table)], + should_fail: true + ) +endforeach diff --git a/test/nbft/nbft-dump-diff.sh.in b/test/nbft/nbft-dump-diff.sh.in new file mode 100755 index 00000000..f697bce0 --- /dev/null +++ b/test/nbft/nbft-dump-diff.sh.in @@ -0,0 +1,8 @@ +#!/bin/sh + +if [ $# -ne 2 ]; then + echo "Usage: $0 TABLE DIFF" >&2 + exit 255 +fi + +"@NBFT_DUMP_PATH@" "$1" | diff --unified "$2" - diff --git a/test/nbft/nbft-dump.c b/test/nbft/nbft-dump.c new file mode 100644 index 00000000..3ff5efa4 --- /dev/null +++ b/test/nbft/nbft-dump.c @@ -0,0 +1,121 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later +/** + * This file is part of libnvme. + * Copyright (c) 2023 Red Hat Inc. + */ + +#include +#include +#include +#include +#include +#include "libnvme.h" + +static void print_hex(unsigned char *buf, int len) +{ + int i; + + for (i = 0; i < len; i++, buf++) + printf("%x", *buf); +} + +static void print_nbft(struct nbft_info *table) +{ + unsigned int i, j; + struct nbft_info_hfi **hfi; + struct nbft_info_security **sec; + struct nbft_info_discovery **disc; + struct nbft_info_subsystem_ns **ssns; + + printf("raw_nbft_size=%zd\n", table->raw_nbft_size); + + printf("host.id="); + print_hex(table->host.id, NVME_UUID_LEN); + printf("\n"); + printf("host.nqn=%s\n", table->host.nqn); + printf("host.host_id_configured=%d\n", table->host.host_id_configured); + printf("host.host_nqn_configured=%d\n", table->host.host_nqn_configured); + printf("host.primary=%d\n", table->host.primary); + + for (hfi = table->hfi_list, i = 0; hfi && *hfi; hfi++, i++) { + printf("hfi_list[%u]->index=%d\n", i, (*hfi)->index); + printf("hfi_list[%u]->transport=%.*s\n", i, (int)sizeof((*hfi)->transport), (*hfi)->transport); + printf("hfi_list[%u]->tcp_info.pci_sbdf=%"PRIu32"\n", i, (*hfi)->tcp_info.pci_sbdf); + printf("hfi_list[%u]->tcp_info.mac_addr=", i); + print_hex((*hfi)->tcp_info.mac_addr, sizeof((*hfi)->tcp_info.mac_addr)); + printf("\n"); + printf("hfi_list[%u]->tcp_info.vlan=%"PRIu16"\n", i, (*hfi)->tcp_info.vlan); + printf("hfi_list[%u]->tcp_info.ip_origin=%u\n", i, (*hfi)->tcp_info.ip_origin); + printf("hfi_list[%u]->tcp_info.ipaddr=%s\n", i, (*hfi)->tcp_info.ipaddr); + printf("hfi_list[%u]->tcp_info.subnet_mask_prefix=%u\n", i, (*hfi)->tcp_info.subnet_mask_prefix); + printf("hfi_list[%u]->tcp_info.gateway_ipaddr=%s\n", i, (*hfi)->tcp_info.gateway_ipaddr); + printf("hfi_list[%u]->tcp_info.route_metric=%"PRIu16"\n", i, (*hfi)->tcp_info.route_metric); + printf("hfi_list[%u]->tcp_info.primary_dns_ipaddr=%s\n", i, (*hfi)->tcp_info.primary_dns_ipaddr); + printf("hfi_list[%u]->tcp_info.secondary_dns_ipaddr=%s\n", i, (*hfi)->tcp_info.secondary_dns_ipaddr); + printf("hfi_list[%u]->tcp_info.dhcp_server_ipaddr=%s\n", i, (*hfi)->tcp_info.dhcp_server_ipaddr); + printf("hfi_list[%u]->tcp_info.host_name=%s\n", i, (*hfi)->tcp_info.host_name); + printf("hfi_list[%u]->tcp_info.this_hfi_is_default_route=%d\n", i, (*hfi)->tcp_info.this_hfi_is_default_route); + printf("hfi_list[%u]->tcp_info.dhcp_override=%d\n", i, (*hfi)->tcp_info.dhcp_override); + } + + for (sec = table->security_list, i = 0; sec && *sec; sec++, i++) { + printf("security_list[%u]->index=%d\n", i, (*sec)->index); + } + + for (disc = table->discovery_list, i = 0; disc && *disc; disc++, i++) { + printf("discovery_list[%u]->index=%d\n", i, (*disc)->index); + if ((*disc)->security) + printf("discovery_list[%u]->security->index=%d\n", i, (*disc)->security->index); + if ((*disc)->hfi) + printf("discovery_list[%u]->hfi->index=%d\n", i, (*disc)->hfi->index); + printf("discovery_list[%u]->uri=%s\n", i, (*disc)->uri); + printf("discovery_list[%u]->nqn=%s\n", i, (*disc)->nqn); + } + + for (ssns = table->subsystem_ns_list, i = 0; ssns && *ssns; ssns++, i++) { + printf("subsystem_ns_list[%u]->index=%d\n", i, (*ssns)->index); + if ((*ssns)->discovery) + printf("subsystem_ns_list[%u]->discovery->index=%d\n", i, (*ssns)->discovery->index); + if ((*ssns)->security) + printf("subsystem_ns_list[%u]->security->index=%d\n", i, (*ssns)->security->index); + printf("subsystem_ns_list[%u]->num_hfis=%d\n", i, (*ssns)->num_hfis); + for (hfi = (*ssns)->hfis, j = 0; hfi && *hfi; hfi++, j++) + printf("subsystem_ns_list[%u]->hfis[%u]->index=%d\n", i, j, (*hfi)->index); + printf("subsystem_ns_list[%u]->transport=%s\n", i, (*ssns)->transport); + printf("subsystem_ns_list[%u]->traddr=%s\n", i, (*ssns)->traddr); + printf("subsystem_ns_list[%u]->trsvcid=%s\n", i, (*ssns)->trsvcid); + printf("subsystem_ns_list[%u]->subsys_port_id=%"PRIu16"\n", i, (*ssns)->subsys_port_id); + printf("subsystem_ns_list[%u]->nsid=%"PRIu32"\n", i, (*ssns)->nsid); + printf("subsystem_ns_list[%u]->nid_type=%d\n", i, (*ssns)->nid_type); + printf("subsystem_ns_list[%u]->nid=", i); + print_hex((*ssns)->nid, 16); + printf("\n"); + printf("subsystem_ns_list[%u]->subsys_nqn=%s\n", i, (*ssns)->subsys_nqn); + printf("subsystem_ns_list[%u]->pdu_header_digest_required=%d\n", i, (*ssns)->pdu_header_digest_required); + printf("subsystem_ns_list[%u]->data_digest_required=%d\n", i, (*ssns)->data_digest_required); + printf("subsystem_ns_list[%u]->controller_id=%d\n", i, (*ssns)->controller_id); + printf("subsystem_ns_list[%u]->asqsz=%d\n", i, (*ssns)->asqsz); + printf("subsystem_ns_list[%u]->dhcp_root_path_string=%s\n", i, (*ssns)->dhcp_root_path_string); + } +} + +int main(int argc, char **argv) +{ + struct nbft_info *table = NULL; + + if (argc < 2) { + fprintf(stderr, "Usage: %s TABLE\n", argv[0]); + return 1; + } + + if (nvme_nbft_read(&table, argv[1]) != 0) { + fprintf(stderr, "Error parsing the NBFT table %s: %m\n", + argv[1]); + return 2; + } + + print_nbft(table); + + nvme_nbft_free(table); + return 0; +} diff --git a/test/nbft/tables/NBFT-auto-ipv6 b/test/nbft/tables/NBFT-auto-ipv6 new file mode 100644 index 0000000000000000000000000000000000000000..64457d7d894e46e36f86ba9ca3a2f3dc667076cc GIT binary patch literal 721 zcmbV}yKWOf6o&t^8_9CVr9m#xmPs+o%zDneLykbqcVE(MJ*lVIT+o~#3@TyW_? zG$4Uw@d^}(4#Fd(<^>QuLkL<25+Xs9uQ{4?&iv>6GuNW5xn}^h9j(V}H>~JRBhJFO z0RWa|S?2*-CEz6iMZ8%Q{(_1;2(zLegm;ILb^**5)kBKA|H3F;{PuqQkpY~+%m9`E6ywatFRtzmg3I?lU%;)m&%eJ0 z;Yr~Y&kUf3PX=)ASn5<{(`7G?{3wY7micMKWLA|d4AYQR(^Q68%@ws!tX#^bS+B2_ z(@6TB6jjEh&zXz^hXtANSRw-HJ4w}X6L$r}2SeN8LNe~#qsgW{oDS5(@kD7|&+}fl z?(w!zzEDhdRGY~SzsA}g518w91@{8waM41EOd^;tfa^`ntqMT<4NOOrY(c-5G)}Nhz0ZB}C0RR91 literal 0 HcmV?d00001 diff --git a/test/nbft/tables/NBFT-dhcp-ipv4 b/test/nbft/tables/NBFT-dhcp-ipv4 new file mode 100644 index 0000000000000000000000000000000000000000..1af159de88d028ddced1658de71124addc48399a GIT binary patch literal 825 zcmbVKzi-n(7=52z5q>NPkV+SnfuR*T$7i2oJ5%i>h6N~)N-!XZ9k+_q#=%Ykl^8l! z`~wJ(P}$g#ARUl8GB6`CA%Vog%)}6MPSZpg740?M~6Z zyH+h0i$wsC_B=oj3HVBYwCj?X0THkY!miYVus^nR2w*p7$5^GDrtCL& zJ$U|W{gVa4YejPV3gF?p0-T$s`Y)UyIn!?ixP%KTaCt6EFj%&$zT?-bE(@Hx&qQDf z=6Q9Gnf1Exg0jWS9$zU1gP^??FV}tH*n*o(7mm(E)iszKaGTY*D;%R{8dl9(LFZ9N zGjuMP?r2H6sdWb1@sn;EXIZ7+Z?`H<9@>^0n@l&Y78AB@v(Stp#%)W4PUvtqbWtFc z2!)dXZZ|MoI)Gf{1f$X6TmI_e#05s9>G=q`X68xfC1d`n0-TwI%tCgZY_M!A&StLj zpwke-&_PF&8V2LW+@xBVBt5O0M3pd&x8qbBG&j>`r^jU4o|g5)Y$wwVoFdA9Lt$D& kDz5aRZlzS>uA%X=qX}2zdPNp3{bRdYtDQy3AWnDi7mL%A0RR91 literal 0 HcmV?d00001 diff --git a/test/nbft/tables/NBFT-dhcp-ipv6 b/test/nbft/tables/NBFT-dhcp-ipv6 new file mode 100644 index 0000000000000000000000000000000000000000..20715eeb3755a3b1cfd11383b185ef6ff7419ca8 GIT binary patch literal 725 zcmbV~zfTlF6vw}Bm*ga9L@f;6#tMpAcV=hV-K*H2YJn0x5=b=W_E>%-a0|P42Q=hL zW3MJw`Zri`6eh;X!d4p#3QPV56Ek-Ngjn%uUgo_w-}kWcmIc0`@MYl@rAzo;M4cJ zjlp2*=q&;9S*uQ@pB(`FBBguI7~vL%9qSq}iG2+i1E9v~$E)vOeJ6xCH?wp)Y1R)A4?7_?K%tRN=CT87@NFcce zJc@YJg9p7wau7oFFX%zYJ)r&tVWnrxZWKZAxl~oxTUAtdFGbny&jvty(T(`pEi3BW zj4jKu06^Pw09_^E83Eef(TNj~J_li2>p^%`TRH%+U1e)@?cXq(yYDY7ZO!c`Pq#L{ z?EZMEo)eHvr6!R%4FDXH?mMGFID<-27{F8C(qFiQz`yP|N-(#LqGUufqNM)l*CK1dQfN$SFb#^-St^8s#Ie1fEzH}S{ zlgZ4VYL2~{KP7d1*8rNo3v2GL4j-}c%867p^gM)cY|uZqv~%IhTokP9N{@-4w3&32 YVt%PS+v83U6g|ulRgXQ7>d$I^0?Ge%0RR91 literal 0 HcmV?d00001 diff --git a/test/nbft/tables/NBFT-static-ipv4 b/test/nbft/tables/NBFT-static-ipv4 new file mode 100644 index 0000000000000000000000000000000000000000..bf3f8404b4eb30d582f48a8c55e130bc939779ea GIT binary patch literal 725 zcmbV~yKmG$5XQf;BZWu9qkwd-P*SY%uGg`B6@Eek1h_~bfzbKlgh4wbapbeqOF|}7Te2WX0%j+P4ANzXF9&?-aym>mxAMg# zl%6ZO%`E9zOh&$7e#%`Ib6$1%5b{TganR%JV{mjQa=|s>^0Jz=8cww)(l>;V|{r6m4JPd)! zWadvbhhD>RNfY1KfYW~q8`P*Kb?N*k+Nuv6-FQNXlia%fvcmV(a literal 0 HcmV?d00001 diff --git a/test/nbft/tables/NBFT-static-ipv4-discovery b/test/nbft/tables/NBFT-static-ipv4-discovery new file mode 100644 index 0000000000000000000000000000000000000000..7ebb40ee9ad1770a5044fbe28db83282b7057a23 GIT binary patch literal 825 zcmbVKJ#W)c6g}6jC?7&XfCODo28LGXIeyR2v7M=Q62k%%NF^8$)QMX~YU5xhfl3UO zSStPif&rC{9SPC_sUrh35)%@P%uEbHFK&~Nfq}E!dv(q`_e1YS5Y{~%pl89&%C$R% z;OWjah|RG~Bc7(7j-bu|xcA}B zef{y(cb_lR2ZM$E_XJeOGMz{t7XW^f@||Fga0_aF>}tRnywrd>s2b3}t-sp+m|Xwz zeC5H5pR1p25MFDF+tUCa-!>%iq1m$1L+R021sRy-EEwSdXc zlFavOKC@~y>4znomwdid4EtegGhVC((sd-am?>S8$%-eK7jlPHxhGvwwS--@m(YIH zHiXF~GhHJ|H;i_FD}K^R<18!pdaY)8jYp2{#TGLyyUC>EI4rUn4aOZ?MsDPCFY+)? zIuZ2a0B+YYSlG|6c8KBd;4K#yk4j)ToaAH8QI=y?lGjf);MCv39BS%hon@PGHbsvb zpM;dc1RZWF1mj|6QzJ@}uF**vpH$BkM)kc4i8kAR7IK(~}-b kai!bnl#4~~34@nhLwW``%c^PdAJ;XSt*nvs<8&K;0P7o%0RR91 literal 0 HcmV?d00001 diff --git a/test/nbft/tables/NBFT-static-ipv6 b/test/nbft/tables/NBFT-static-ipv6 new file mode 100644 index 0000000000000000000000000000000000000000..07b09cfba5bd22277bd63d53a86b8e4499eabe2e GIT binary patch literal 721 zcmbV}J8Tm{5QhJ`i)6VA(4|0EI>jEh>%Es7a<7FVA`t{ZLF2~~Sva=w=1fB61}La# zkf4aD=|Dns2!xPmQ_~|PI(iT~CnQ9ICSNn!nc08l-@THmjeQHC$LU&j`I?j7T+dXJ ztpkALILv=L@$l;&B?R8*u)s-|Q~QY5Td6f#kP&x3?7UrKUZ%)(62+Uiz}xx zeUe-Md&X+(@u%K0HJ8f@H a+QV&DNp8EQ?3i8SNz{qvKV66OXQ$taC2j!# literal 0 HcmV?d00001 diff --git a/test/nbft/tables_bad/NBFT-bad-oldspec b/test/nbft/tables_bad/NBFT-bad-oldspec new file mode 100644 index 0000000000000000000000000000000000000000..e09d6ad0f834a83dba205236c0183c2707043d0f GIT binary patch literal 1103 zcmd^-!EVz)5QhJ?14TkeLE?ZALOJw?yxFzAw&PRUI-!TEjlil97qGo{6p`Ag1*Af5qENEq1>q!rGM8~t%+j8b zm{ogtS`owBM~}$XziH7?BSo2(@DBGD}sC+7n)^BhZ|N;1UwLli1d(| zs~(zFeJGuAQ)3Rz@-aF rPzz+_Xpw1i$$EhySls*spelN|h-PlL%NaFn%7sC>Zo4LPSQozlF#?|f literal 0 HcmV?d00001 diff --git a/test/nbft/tables_bad/NBFT-random-noise b/test/nbft/tables_bad/NBFT-random-noise new file mode 100644 index 0000000000000000000000000000000000000000..296bcfe298f29bcad82b16275ccd9258ad9e4c9b GIT binary patch literal 512 zcmV+b0{{Kt$w-lwO9WA6hW0V;P%f|Ce!x8;*>EktqwGXv0&paT@}DR?vi6gG@eNxb zAl3gS>#I|`6c|pTKHku}&wbl_pk>A@WAYQQj1oL7?X0&cy`o}vE&FabZ#wXw=l~atc<8Iv|+G4zfqQrH3J<%&rA2W4PzD9?E`D>%se~(wy$j7UZ zf6eGD=GKld}sqGrf)@_~GqV*O+8^)Hk~m!JXTpukmj zB84eiXg=Ej!Ubzj*zHHQA^Q@yWD{3o(;QonfKI(4In~br%fF#aLVjtui+|`vp&@|g zU`2d?^;Azj_ZJKQ&Lp|YLWKKI3YQ)08=qDU>j}USJiEn)fX|#?F$WI{#u7~GmsE7D zyPw9_Zp9CJpG@j_`PF7qneK;@KkWq3#)ZHus{TVs9Mqdv&Wk%M+#P*I*l=N}S`H;n zNzbs-IiO7JSO