View Javadoc

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  }