Coverage Report - org.jscsi.target.scsi.cdb.SendDiagnosticCdb
 
Classes in this File Line Coverage Branch Coverage Complexity
SendDiagnosticCdb
0%
0/18
0%
0/8
1.571
 
 1  
 package org.jscsi.target.scsi.cdb;
 2  
 
 3  
 
 4  
 import java.nio.ByteBuffer;
 5  
 
 6  
 import org.jscsi.target.util.BitManip;
 7  
 import org.jscsi.target.util.ReadWrite;
 8  
 
 9  
 
 10  
 /**
 11  
  * This class represents Command Descriptor Blocks for the <code>SEND DIAGNOSTIC</code> SCSI command.
 12  
  * 
 13  
  * @author Andreas Ergenzinger
 14  
  */
 15  
 public final class SendDiagnosticCdb extends CommandDescriptorBlock {
 16  
 
 17  
     /**
 18  
      * If the {@link #selfTest} bit is set to one, the {@link #selfTestCode} field shall contain 000b (
 19  
      * {@link SelfTestCode#ALL_ZEROS}. If the SELFTEST bit is set to zero, the contents of SELF-TEST CODE specifies
 20  
      * which diagnostic operation the device server shall perform.
 21  
      * 
 22  
      * @see SelfTestCode
 23  
      */
 24  
     private final SelfTestCode selfTestCode;
 25  
 
 26  
     /**
 27  
      * A self-test (SELFTEST) bit set to one specifies that the device server shall perform the logical unit default
 28  
      * self-test.
 29  
      * <p>
 30  
      * A SELFTEST bit set to zero specifies that the device server shall perform the diagnostic operation specified by
 31  
      * the {@link #selfTestCode} field or in the parameter list.
 32  
      * <p>
 33  
      * Only support for the default self-test feature, as required by SPC-3, is implemented. Request for other types of
 34  
      * self-test operations will be declined.
 35  
      */
 36  
     private final boolean selfTest;
 37  
 
 38  
     /**
 39  
      * A page format (PF) bit set to one specifies that the SEND DIAGNOSTIC parameters and any parameters returned by a
 40  
      * following RECEIVE DIAGNOSTIC RESULTS command with the PCV bit set to zero shall contain a single diagnostic page.
 41  
      * <p>
 42  
      * A PF bit set to zero specifies that all SEND DIAGNOSTIC parameters are vendor specific. If the PARAMETER LIST
 43  
      * LENGTH field is set to zero and the SEND DIAGNOSTIC command is not going to be followed by a corresponding
 44  
      * RECEIVE DIAGNOSTIC RESULTS command with the PCV bit set to zero, then the application client shall set the PF bit
 45  
      * to zero.
 46  
      * <p>
 47  
      * The implementation of the PF bit is optional and therefore not supported by the jSCSI Target.
 48  
      */
 49  
     private final boolean pageFormat;
 50  
 
 51  
     /**
 52  
      * A unit offline (UNITOFFL) bit set to one specifies that the device server may perform diagnostic operations that
 53  
      * may affect the user accessible medium on the logical unit (e.g., write operations to the user accessible medium,
 54  
      * or repositioning of the medium on sequential access devices). The device server may ignore the UNITOFFL bit. A
 55  
      * UNITOFFL bit set to zero prohibits any diagnostic operations that may be detected by subsequent tasks. When the
 56  
      * {@link #selfTest} bit is set to zero, the UNITOFFL bit shall be ignored.
 57  
      */
 58  
     private final boolean unitOffline;
 59  
 
 60  
     /**
 61  
      * A SCSI target device offline (DEVOFFL) bit set to one grants permission to the device server to perform
 62  
      * diagnostic operations that may affect all the logical units in the SCSI target device (e.g., alteration of
 63  
      * reservations, log parameters, or sense data). The device server may ignore the DEVOFFL bit. A DEVOFFL bit set to
 64  
      * zero prohibits diagnostic operations that may be detected by subsequent tasks. When the {@link #selfTest} bit is
 65  
      * set to zero, the DEVOFFL bit shall be ignored.
 66  
      */
 67  
     private final boolean deviceOffline;
 68  
 
 69  
     /**
 70  
      * The PARAMETER LIST LENGTH field specifies the length in bytes of the parameter list that shall be transferred
 71  
      * from the application client Data-Out Buffer to the device server. A parameter list length of zero specifies that
 72  
      * no data shall be transferred. This condition shall not be considered an error. If PF bit is set to one and the
 73  
      * specified parameter list length results in the truncation of the diagnostic page (e.g., the parameter list length
 74  
      * does not match the page length specified in the diagnostic page), then the command shall be terminated with CHECK
 75  
      * CONDITION status, with the sense key set to ILLEGAL REQUEST, and the additional sense code set to INVALID FIELD
 76  
      * IN CDB.
 77  
      */
 78  
     private final short parameterListLength;
 79  
 
 80  
     public SendDiagnosticCdb (ByteBuffer buffer) {
 81  0
         super(buffer);
 82  
 
 83  
         // deserialize specific fields
 84  0
         final byte b = buffer.get(1);
 85  
 
 86  
         // self test
 87  0
         selfTest = BitManip.getBit(b, 2);
 88  0
         if (!selfTest) addIllegalFieldPointer(1, 2);// only the default self-test feature
 89  
                                                     // is supported
 90  
 
 91  
         // self test code
 92  0
         selfTestCode = SelfTestCode.getValue(b >>> 5);
 93  0
         if (selfTest && selfTestCode != SelfTestCode.ALL_ZEROS) addIllegalFieldPointer(1, 7);
 94  
 
 95  
         // page format
 96  0
         pageFormat = BitManip.getBit(b, 4);
 97  0
         if (pageFormat) addIllegalFieldPointer(1, 4);// The implementation of the PF bit is
 98  
                                                      // optional.
 99  
 
 100  
         // device offline
 101  0
         deviceOffline = BitManip.getBit(b, 1);
 102  
 
 103  
         // unit offline
 104  0
         unitOffline = BitManip.getBit(b, 0);
 105  
 
 106  
         // parameter list length
 107  0
         parameterListLength = (short) ReadWrite.readTwoByteInt(buffer, 3);
 108  0
     }
 109  
 
 110  
     public final boolean getSelfTest () {
 111  0
         return selfTest;
 112  
     }
 113  
 
 114  
     public final SelfTestCode getSelfTestCode () {
 115  0
         return selfTestCode;
 116  
     }
 117  
 
 118  
     public final boolean getPageFormat () {
 119  0
         return pageFormat;
 120  
     }
 121  
 
 122  
     public final boolean getUnitOffline () {
 123  0
         return unitOffline;
 124  
     }
 125  
 
 126  
     public final boolean getDeviceOffline () {
 127  0
         return deviceOffline;
 128  
     }
 129  
 
 130  
     public final short getParameterListLength () {
 131  0
         return parameterListLength;
 132  
     }
 133  
 
 134  
 }