Skip to content

Commit

Permalink
[infiniband] Add support for SRP over Infiniband
Browse files Browse the repository at this point in the history
SRP is the SCSI RDMA Protocol.  It allows for a method of SAN booting
whereby the target is responsible for reading and writing data using
Remote DMA directly to the initiator's memory.  The software initiator
merely sends and receives SCSI commands; it never has to touch the
actual data.
  • Loading branch information
Michael Brown committed Aug 10, 2009
1 parent 8de49af commit 0c30dc6
Show file tree
Hide file tree
Showing 9 changed files with 1,960 additions and 0 deletions.
63 changes: 63 additions & 0 deletions src/arch/i386/interface/pcbios/ib_srpboot.c
@@ -0,0 +1,63 @@
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <gpxe/sanboot.h>
#include <int13.h>
#include <gpxe/srp.h>

FILE_LICENCE ( GPL2_OR_LATER );

static int ib_srpboot ( const char *root_path ) {
struct scsi_device *scsi;
struct int13_drive *drive;
int rc;

scsi = zalloc ( sizeof ( *scsi ) );
if ( ! scsi ) {
rc = -ENOMEM;
goto err_alloc_scsi;
}
drive = zalloc ( sizeof ( *drive ) );
if ( ! drive ) {
rc = -ENOMEM;
goto err_alloc_drive;
}

if ( ( rc = srp_attach ( scsi, root_path ) ) != 0 ) {
printf ( "Could not attach IB_SRP device: %s\n",
strerror ( rc ) );
goto err_attach;
}
if ( ( rc = init_scsidev ( scsi ) ) != 0 ) {
printf ( "Could not initialise IB_SRP device: %s\n",
strerror ( rc ) );
goto err_init;
}

drive->blockdev = &scsi->blockdev;

register_int13_drive ( drive );
printf ( "Registered as BIOS drive %#02x\n", drive->drive );
printf ( "Booting from BIOS drive %#02x\n", drive->drive );
rc = int13_boot ( drive->drive );
printf ( "Boot failed\n" );

printf ( "Unregistering BIOS drive %#02x\n", drive->drive );
unregister_int13_drive ( drive );

err_init:
srp_detach ( scsi );
err_attach:
free ( drive );
err_alloc_drive:
free ( scsi );
err_alloc_scsi:
return rc;
}

struct sanboot_protocol ib_srp_sanboot_protocol __sanboot_protocol = {
.prefix = "ib_srp:",
.boot = ib_srpboot,
};
1 change: 1 addition & 0 deletions src/config/general.h
Expand Up @@ -62,6 +62,7 @@ FILE_LICENCE ( GPL2_OR_LATER );

//#undef SANBOOT_PROTO_ISCSI /* iSCSI protocol */
//#undef SANBOOT_PROTO_AOE /* AoE protocol */
//#undef SANBOOT_PROTO_IB_SRP /* Infiniband SCSI RDMA protocol */

/*
* Name resolution modules
Expand Down
3 changes: 3 additions & 0 deletions src/core/config.c
Expand Up @@ -109,6 +109,9 @@ REQUIRE_OBJECT ( iscsiboot );
#ifdef SANBOOT_PROTO_AOE
REQUIRE_OBJECT ( aoeboot );
#endif
#ifdef SANBOOT_PROTO_IB_SRP
REQUIRE_OBJECT ( ib_srpboot );
#endif

/*
* Drag in all requested resolvers
Expand Down

0 comments on commit 0c30dc6

Please sign in to comment.