Skip to content

Commit 3b4933e

Browse files
committed
transport: storage: add scsi support
Signed-off-by: Wilfred Mallawa <wilfred.mallawa@wdc.com>
1 parent e856684 commit 3b4933e

File tree

9 files changed

+947
-2
lines changed

9 files changed

+947
-2
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ minicbor-derive = { version = "0.15", features = [
7575
], optional = true }
7676
async-std = { version = "1.12", features = ["attributes"], optional = true }
7777
futures = { version = "0.3", optional = true }
78-
nix = { version = "0.29.0", features = ["user"], optional = true }
78+
nix = { version = "0.29.0", features = ["user", "fs"], optional = true }
7979
libmctp = { version = "0.2" }
8080
inquire = { version = "0.7.5", optional = true}
8181

build.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ fn main() {
4141
println!("cargo:rustc-link-arg=-lspdm_crypt_ext_lib");
4242
println!("cargo:rustc-link-arg=-lspdm_transport_pcidoe_lib");
4343
println!("cargo:rustc-link-arg=-lspdm_transport_mctp_lib");
44+
println!("cargo:rustc-link-arg=-lspdm_transport_storage_lib");
4445

4546
// Link SPDM Test Libraries
4647
let mut builder = if cfg!(feature = "libspdm_tests") {

scripts/scsi/create-disk-spdm.sh

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#!/bin/bash
2+
3+
if [ $# != 5 ]; then
4+
echo "Usage: $0 <disk name> <cap (GB)> HM|HA <zone size (MB)> <conv zones num>"
5+
exit 1;
6+
fi
7+
8+
dname="$1"
9+
cap="$2"
10+
model="$3"
11+
zs="$4"
12+
cnum="$5"
13+
14+
naa="naa.50014059cfa9ba75"
15+
16+
# Setup emulated disk
17+
cat << EOF | targetcli
18+
19+
cd /backstores/user:zbc
20+
create name=${dname} size=${cap}G cfgstring=model-${model}/zsize-${zs}/conv-${cnum}/spdm-2323@/var/local/${dname}.raw
21+
cd /loopback
22+
create ${naa}
23+
cd ${naa}/luns
24+
create /backstores/user:zbc/${dname} 0
25+
cd /
26+
exit
27+
28+
EOF
29+
30+
sleep 1
31+
disk=`lsscsi | grep "TCMU ZBC device" | cut -d '/' -f3 | sed 's/ //g'`
32+
echo "mq-deadline" > /sys/block/"${disk}"/queue/scheduler

scripts/scsi/teardown-disk.sh

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#!/bin/bash
2+
3+
if [ $# != 1 ]; then
4+
echo "Usage: $0 <disk name (e.g. zbc0)"
5+
exit 1;
6+
fi
7+
8+
dname="$1"
9+
10+
naa="naa.50014059cfa9ba75"
11+
12+
# Delete emulated disk
13+
cat << EOF | targetcli
14+
15+
cd /loopback/${naa}/luns
16+
delete 0
17+
cd /loopback
18+
delete ${naa}
19+
cd /backstores/user:zbc
20+
delete ${dname}
21+
cd /
22+
exit
23+
24+
EOF

src/libspdm/spdm.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,8 @@ pub enum TransportLayer {
277277
Doe,
278278
/// DMTF Management Component Transport Protocol
279279
Mctp,
280+
/// SCSI Security Protocol In/Out commands
281+
Storage,
280282
}
281283

282284
#[cfg(feature = "no_std")]
@@ -506,6 +508,18 @@ pub unsafe fn setup_transport_layer(
506508
)
507509
};
508510
}
511+
TransportLayer::Storage => {
512+
unsafe {
513+
libspdm_register_transport_layer_func(
514+
context,
515+
libspdm_max_spdm_msg_size,
516+
LIBSPDM_STORAGE_TRANSPORT_HEADER_SIZE,
517+
LIBSPDM_STORAGE_TRANSPORT_TAIL_SIZE,
518+
Some(libspdm_transport_storage_encode_message),
519+
Some(libspdm_transport_storage_decode_message),
520+
)
521+
};
522+
}
509523
}
510524

511525
let libspdm_scratch_buffer_size =

src/main.rs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use async_std::task;
1212
use clap::{Parser, Subcommand};
1313
use futures::future::join_all;
1414
use libspdm::libspdm_rs::*;
15+
use nix::errno::Errno;
1516
use nix::unistd::geteuid;
1617
use sha2::{Digest, Sha256, Sha384, Sha512};
1718
use std::fs::File;
@@ -31,6 +32,7 @@ mod doe_pci_cfg;
3132
mod io_buffers;
3233
mod qemu_server;
3334
mod request;
35+
mod scsi;
3436
mod socket_client;
3537
mod socket_server;
3638
mod tcg_concise_evidence_binding;
@@ -43,6 +45,14 @@ struct Args {
4345
#[command(subcommand)]
4446
command: Commands,
4547

48+
/// Use SCSI commands for the target device
49+
#[arg(short, long, requires_ifs([("true", "blk_dev_path")]))]
50+
scsi: bool,
51+
52+
/// Path to the SCSI block device
53+
#[arg(long)]
54+
blk_dev_path: Option<String>,
55+
4656
/// Use the Linux PCIe extended configuration backend
4757
/// This is generally run on the Linux host machine
4858
#[arg(short, long)]
@@ -642,6 +652,9 @@ async fn main() -> Result<(), ()> {
642652

643653
let mut count = 0;
644654

655+
cli.scsi.then(|| {
656+
count += 1;
657+
});
645658
cli.doe_pci_cfg.then(|| {
646659
count += 1;
647660
});
@@ -704,8 +717,16 @@ async fn main() -> Result<(), ()> {
704717
error!("Only MCTP supported over USB I2C");
705718
return Err(());
706719
}
707-
708720
usb_i2c::register_device(cntx_ptr, cli.usb_i2c_dev, cli.usb_i2c_baud)?;
721+
} else if cli.scsi {
722+
scsi::cmd_scsi_get_info(&cli.blk_dev_path.clone().unwrap()).unwrap();
723+
if let Err(e) = scsi::cmd_scsi_get_sec_info(&cli.blk_dev_path.clone().unwrap()) {
724+
if e == Errno::ENOTSUP {
725+
error!("SPDM is not supported by this device");
726+
}
727+
return Err(());
728+
}
729+
scsi::register_device(cntx_ptr, &cli.blk_dev_path.clone().unwrap())?;
709730
} else if cli.qemu_server {
710731
if let Commands::Request { .. } = cli.command {
711732
error!("QEMU Server does not support running an SPDM requester");
@@ -730,6 +751,13 @@ async fn main() -> Result<(), ()> {
730751
spdm::TransportLayer::Mctp,
731752
spdm::LIBSPDM_MAX_SPDM_MSG_SIZE,
732753
)?;
754+
} else if cli.scsi {
755+
spdm::setup_transport_layer(
756+
cntx_ptr,
757+
spdm::TransportLayer::Storage,
758+
spdm::LIBSPDM_MAX_SPDM_MSG_SIZE,
759+
)
760+
.unwrap();
733761
} else {
734762
spdm::setup_transport_layer(
735763
cntx_ptr,

src/qemu_server.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,7 @@ pub fn register_device(
407407
Some(qemu_receive_message_mctp),
408408
);
409409
}
410+
TransportLayer::Storage => todo!(),
410411
}
411412
io_buffers::libspdm_setup_io_buffers(
412413
context,

0 commit comments

Comments
 (0)