Skip to content

darrenstarr/SCSI.net

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Build Status

SCSI.net

This is a project to provide an implementation of the SCSI protocol as well as iSCSI protocol written in .NET Core 3.

This project makes heavy use of the Span<> funtionality of C# and as a result the code, which I believe is quite well structured suffers a few limitations in architecture. Since it's not possible to use fixed position fields in structures in C# and it's also impossible to define fixed sized arrays in structures, the project gets a little ugly at times by employing private padding fields to make the structures the right sizes.

[StructLayout(LayoutKind.Sequential,Pack=1)]
public struct BasicHeaderSegment : ISCSISegment
{
    private uint OpcodeFieldsBE;
    private uint LengthsBE;
    private ulong LunOpcodeSpecificFieldsBE;
    private uint InitiatorTaskTagBE;
    private ulong OpcodeSpecificFields1BE;
    private ulong OpcodeSpecificFields2BE;
    private ulong OpcodeSpecificFields3BE;
    private uint OpcodeSpecificFields4BE;
...
}

This is an example of ugly padding which was added to make things line up.

Reasoning

First of all, I can't seem to find any memory safe implementations of iSCSI on the Internet. Pretty much all implementationsa I can find are written in C and the code is pretty much unmaintainable.

I need an iSCSI or FCoE implementation of a SCSI target capable of supporting automated server management. This doesn't sound very difficult, but using existing implementations of iSCSI, it's a bit of a mess. In my case, using Cisco UCS, I want to be able to have a different LUN 0 for each target, but it should be differentiated by initiator and authentication. I want to use the same target name and LUN for all blades.

In addition, I want to support disk image files. I'm considering just supporting RAM disk, QCOW2 and Linux LVM at this time, but I may add support for more later on.

Project status

At the moment, I'm making use of the iscsi-scsi-10TB-data-device.zip sample file found on the Wireshark Wiki as a starting point for development.

At this time, the code is capable of fully parsing and reproducing the first 8 packets of the file. This is quite a bit further along than it sounds. From what I can see, there are only about 2-dozen packet types needed to implement iSCSI at least at a fairly privative level. Not to mention that there's a LOT of code coverage in place for unit tests on this code.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published