1 package org.jscsi.target.scsi.cdb; 2 3 4 import java.nio.ByteBuffer; 5 6 import org.jscsi.target.util.ReadWrite; 7 8 9 /** 10 * This class represents Command Descriptor Blocks for the <code>READ (6) 11 * </code> SCSI command. 12 * <p> 13 * The READ (6) command requests that the device server read the specified logical block(s) and transfer them to the 14 * data-in buffer. Each logical block read includes user data and, if the medium is formatted with protection 15 * information enabled, protection information. Each logical block transferred includes user data but does not include 16 * protection information. 17 * <p> 18 * Although the READ (6) command is limited to addressing up to 2,097,151 logical blocks, this command has been 19 * maintained as mandatory since some system initialization routines require that the READ (6) command be used. System 20 * initialization routines should migrate from the READ (6) command to the READ (10) command, which is capable of 21 * addressing 4,294,947,295 logical blocks, or the READ (16) command, which is capable of addressing 22 * 18,446,744,073,709,551,615 logical blocks. 23 * 24 * @author Andreas Ergenzinger 25 */ 26 public class Read6Cdb extends ReadCdb { 27 28 public Read6Cdb (ByteBuffer buffer) { 29 super(buffer); 30 } 31 32 @Override 33 protected long deserializeLogicalBlockAddress (ByteBuffer buffer) { 34 // the first three bits of byte 1 are reserved i.e. must be 0 35 // check that 36 final byte b = buffer.get(1); 37 if (((b >> 5) & 7) != 0) addIllegalFieldPointer(1); 38 39 // read the field's value 40 return ((b & 31) << 16) | ReadWrite.readTwoByteInt(buffer, 2); 41 } 42 43 @Override 44 protected int deserializeTransferLength (ByteBuffer buffer) { 45 /* 46 * A TRANSFER LENGTH field set to zero specifies that 256 logical blocks shall be read. Any other value 47 * specifies the number of logical blocks that shall be read. 48 */ 49 final int value = ReadWrite.readOneByteInt(buffer, 4); 50 if (value == 0) return 256; 51 return value; 52 } 53 54 @Override 55 protected int getLogicalBlockAddressFieldIndex () { 56 return 1; 57 } 58 59 @Override 60 protected int getTransferLengthFieldIndex () { 61 return 4; 62 } 63 64 }