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>REPORT LUNS</code> SCSI command.
11   * 
12   * @author Andreas Ergenzinger
13   */
14  public class ReportLunsCDB extends CommandDescriptorBlock {
15  
16      /**
17       * The SELECT REPORT field specifies the types of logical unit addresses that shall be reported.
18       * 
19       * @see SelectReport
20       */
21      private final SelectReport selectReport;
22  
23      /**
24       * The ALLOCATION LENGTH field specifies the maximum number of bytes that an application client has allocated in the
25       * Data-In Buffer. An allocation length of zero specifies that no data shall be transferred. This condition shall
26       * not be considered as an error. The device server shall terminate transfers to the Data-In Buffer when the number
27       * of bytes specified by the ALLOCATION LENGTH field have been transferred or when all available data have been
28       * transferred, whichever is less.
29       * <p>
30       * The allocation length is used to limit the maximum amount of variable length data (e.g., mode data, log data,
31       * diagnostic data) returned to an application client. If the information being transferred to the Data-In Buffer
32       * includes fields containing counts of the number of bytes in some or all of the data, then the contents of these
33       * fields shall not be altered to reflect the truncation, if any, that results from an insufficient ALLOCATION
34       * LENGTH value, unless the standard that describes the Data-In Buffer format states otherwise.
35       * <p>
36       * If the amount of information to be transferred exceeds the maximum value that the ALLOCATION LENGTH field is
37       * capable of specifying, the device server shall transfer no data and terminate the command with CHECK CONDITION
38       * status, with the sense key set to ILLEGAL REQUEST, and the additional sense code set to INVALID FIELD IN CDB.
39       * <p>
40       * If EVPD is set to zero, the allocation length should be at least five, so that the ADDITIONAL LENGTH field in the
41       * parameter data is returned. If EVPD is set to one, the allocation length should be should be at least four, so
42       * that the PAGE LENGTH field in the parameter data is returned.
43       */
44      private final int allocationLength;
45  
46      public ReportLunsCDB (ByteBuffer buffer) {
47          super(buffer);
48  
49          // select report
50          selectReport = SelectReport.getValue(buffer.get(2));
51          if (selectReport == null) addIllegalFieldPointer(2);// reserved select report value
52  
53          // allocation length
54          allocationLength = ReadWrite.readFourByteInt(buffer, 6);
55          if (allocationLength < 16) addIllegalFieldPointer(6);// The allocation length should be at
56                                                               // least 16.
57      }
58  
59      public final int getAllocationLength () {
60          return allocationLength;
61      }
62  
63      public final SelectReport getSelectReport () {
64          return selectReport;
65      }
66  }