RASCSI/cpp/test
Klaus Kämpf ad5eae93e7
Multiple fixes for ModeSelect (#1405)
* Allow 'empty' ModeSelect6

tl;dr

Treat a computed length of 0 as `has_valid_page_code`.

Details:

The SRM console (aka 'BIOS') of DEC Alpha sends an empty
ModeSelect6 with the following data:
~~~
ModeSelect6, CDB $151000000c00
~~~

That makes 12 byte(s) as follows
~~~
  0  1  2  3   4   5  6  7   8   9 10 11
 00 00 00 08  00  00 00 00  00  00 02 00
~~~

decoding it (accoring to [1], Section 8.3.3, Table 94) gives us

Mode Data Length 0
Medium Type      0
Device-specific  0
Block desc len   8

Density Code     0
Number of blks   0
Reserved         0
Block length     512

`scsi_command_util::ModeSelect` computes
~~~
offset = 4 + buf[3];
~~~

giving 12 and

~~~
length -= offset;
~~~

giving 0.

Thus it never enters the `while` loop and `has_valid_page_code` stays
`false`, raising an error.

[1] [Small Computer System Interface - 2 rev 10L.pdf](https://dn790004.ca.archive.org/0/items/SCSISpecificationDocumentsSCSIDocuments/Small%20Computer%20System%20Interface%20-%202%20rev%2010L.pdf)

Signed-off-by: Klaus Kämpf <kkaempf@gmail.com>

* Allow ModeSelect with page code 1

OpenVMS Alpha (the operating system, not the SRM BIOS) uses
ModeSelect6 with a page code of 1.

The semantics are unknown, just accepting it works for me.

Signed-off-by: Klaus Kämpf <kkaempf@gmail.com>

* Fix page length computation in ModeSelect

tl;dr

The 'skip to next ModeSelect page' computation was off-by-one, either not
taking the page code itself into account or missing the fact that the
page length is given as `n - 1`.

Fix:

Add 1 to the computed length.

Details:

OpenVMS Alpha sends a ModeSelect6 as follows
~~~
command:

ModeSelect6, CDB $151000001900

payload:

 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
00 00 00 08 00 00 00 00 00 00 02 00 01 0a 24 00 00 00 00 00 00 00 00 00 00
~~~

This translates to (accoring to [1], Section 8.3.3)

~~~
Mode Data Length 0
Medium Type      0
Device-specific  0
Block desc len   8
~~~

with the following offset / length computation _before_ the `while` loop
~~~
offset = 12
length = 13
~~~

The first payload section is
~~~
 4  5  6  7  8  9 10 11
00 00 00 00 00 00 02 00
~~~

translating to

~~~
Density Code     0
Number of blks   0
Reserved         0
Block length   0x200 512
~~~

Then follows a pagecode 1 as
~~~
12 13 14 15 16 17 18 19 20 21 22 23 24
01 0a 24 00 00 00 00 00 00 00 00 00 00
~~~

translating to
~~~~
Page code        1
Page length -1  10
Mode parameters 24 00 00 00 00 00 00 00 00 00 00
~~~

computing (inside the `while` loop, as `// Advance to the next page`)

~~~
size =  10 + 2 = 12
~~~

followed by new `offset` and `length` values

~~~
offset = 25
length = 1
~~~

So it stays in the `while` loop (and has a larger-than-buffer `offset`
value)

Signed-off-by: Klaus Kämpf <kkaempf@gmail.com>
2024-01-07 15:06:35 +09:00
..
abstract_controller_test.cpp Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
bus_test.cpp Rebrand project to PiSCSI (#1016) 2022-12-05 09:58:23 -08:00
command_context_test.cpp Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
controller_manager_test.cpp Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
ctapdriver_test.cpp Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
device_factory_test.cpp Move sector sizes lists from DeviceFactory to the respective devices (#1323) 2023-11-14 15:32:46 +01:00
device_test.cpp Move default device parameters from DeviceFactory to the respective devices #1257 (#1259) 2023-10-30 11:24:18 +01:00
disk_test.cpp Move sector sizes lists from DeviceFactory to the respective devices (#1323) 2023-11-14 15:32:46 +01:00
gpiobus_raspberry_test.cpp Use standard C++ timer for long timeouts (#1327), remove unused code (#1328) 2023-11-14 16:03:25 +01:00
host_services_test.cpp Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
linux_os_stubs.cpp Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
linux_os_stubs.h Rebrand project to PiSCSI (#1016) 2022-12-05 09:58:23 -08:00
localizer_test.cpp Rebrand project to PiSCSI (#1016) 2022-12-05 09:58:23 -08:00
mocks.h Use standard C++ timer for long timeouts (#1327), remove unused code (#1328) 2023-11-14 16:03:25 +01:00
mode_page_device_test.cpp Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
network_util_test.cpp Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
phase_handler_test.cpp Fix SonarQube issues (#1276) 2023-11-01 12:53:05 +01:00
piscsi_exceptions_test.cpp Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
piscsi_executor_test.cpp Move sector sizes lists from DeviceFactory to the respective devices (#1323) 2023-11-14 15:32:46 +01:00
piscsi_image_test.cpp Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
piscsi_response_test.cpp Improve how commands are internally executed (#1247) 2023-10-30 13:57:46 +01:00
piscsi_service_test.cpp Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
piscsi_util_test.cpp Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
primary_device_test.cpp Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
protobuf_util_test.cpp scsictl shall accept generic key/value pairs for options that take parameters (#1240) (#1274) 2023-10-31 09:02:28 +01:00
scsi_command_util_test.cpp Multiple fixes for ModeSelect (#1405) 2024-01-07 15:06:35 +09:00
scsi_controller_test.cpp Fix SonarQube issues (#1276) 2023-11-01 12:53:05 +01:00
scsi_daynaport_test.cpp Move default device parameters from DeviceFactory to the respective devices #1257 (#1259) 2023-10-30 11:24:18 +01:00
scsi_host_bridge_test.cpp Move default device parameters from DeviceFactory to the respective devices #1257 (#1259) 2023-10-30 11:24:18 +01:00
scsi_printer_test.cpp Move default device parameters from DeviceFactory to the respective devices #1257 (#1259) 2023-10-30 11:24:18 +01:00
scsicd_test.cpp Move sector sizes lists from DeviceFactory to the respective devices (#1323) 2023-11-14 15:32:46 +01:00
scsictl_commands_test.cpp Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
scsictl_display_test.cpp Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
scsictl_parser_test.cpp Rebrand project to PiSCSI (#1016) 2022-12-05 09:58:23 -08:00
scsidump_test.cpp Add options to only run INQUIRY and to scan the bus to scsidump (#1092) (#1261) 2023-10-30 11:34:07 +01:00
scsihd_nec_test.cpp Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
scsihd_test.cpp Move sector sizes lists from DeviceFactory to the respective devices (#1323) 2023-11-14 15:32:46 +01:00
scsimo_test.cpp Move sector sizes lists from DeviceFactory to the respective devices (#1323) 2023-11-14 15:32:46 +01:00
storage_device_test.cpp Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
test_setup.cpp Issues 1179 and 1182 (#1232) 2023-10-15 08:38:15 +02:00
test_shared.cpp Improve how commands are internally executed (#1247) 2023-10-30 13:57:46 +01:00
test_shared.h Add options to only run INQUIRY and to scan the bus to scsidump (#1092) (#1261) 2023-10-30 11:34:07 +01:00