1 package org.jscsi.target.scsi.cdb; 2 3 4 import java.nio.ByteBuffer; 5 6 import org.jscsi.target.util.BitManip; 7 8 9 /** 10 * This class represents Command Descriptor Blocks for the <code>FORMAT UNIT</code> SCSI command. 11 * 12 * @author Andreas Ergenzinger 13 */ 14 public final class FormatUnitCDB extends CommandDescriptorBlock { 15 16 /** 17 * The format protection information (FMTPINFO) field in combination with the PROTECTION FIELD USAGE field 18 */ 19 private byte formatProtectionInformation; 20 21 /** 22 * A LONGLIST bit set to zero specifies that the parameter list, if any, contains a short parameter list header as 23 * defined in SBC-3. A LONGLIST bit set to one specifies that the parameter list, if any, contains a long parameter 24 * list header. 25 * <p> 26 * If the FMTDATA bit is set to zero, then the LONGLIST bit shall be ignored. 27 */ 28 private boolean longList; 29 30 /** 31 * A format data (FMTDATA) bit set to zero specifies that no parameter list be transferred from the data-out buffer 32 * (i.e. the PDU's data segment is empty). 33 */ 34 private boolean formatData; 35 36 /** 37 * A complete list (CMPLST) bit set to zero specifies that the defect list included in the FORMAT UNIT parameter 38 * list shall be used in an addition to the existing list of defects. 39 */ 40 private boolean completeList; 41 42 /** 43 * If the FMTDATA bit is set to one, then the DEFECT LIST FORMAT field specifies the format of the address 44 * descriptors in the defect list. 45 */ 46 private DefectListFormat defectListFormat; 47 48 public FormatUnitCDB (ByteBuffer buffer) { 49 super(buffer); 50 51 byte b = buffer.get(1); 52 53 // format protection information 54 formatProtectionInformation = (byte) (b >>> 6); 55 56 // long list 57 longList = BitManip.getBit(b, 5); 58 59 // format data 60 formatData = BitManip.getBit(b, 4); 61 62 // complete list 63 completeList = BitManip.getBit(b, 3); 64 65 // defect list format 66 defectListFormat = DefectListFormat.valueOf(b & 7); 67 if (!formatData) { 68 if (defectListFormat != DefectListFormat.SHORT_BLOCK) addIllegalFieldPointer(1, 2);// illegal defect list 69 // format 70 /* 71 * If the FMTDATA bit is set to zero and the FMTPINFO field is not set to zero, then the device server shall 72 * terminate the command with CHECK CONDITION status with the sense key set to ILLEGAL REQUEST and the 73 * additional sense code set to INVALID FIELD IN CDB. 74 */ 75 if (formatProtectionInformation != 0) addIllegalFieldPointer(1, 7); 76 } else if (formatData) addIllegalFieldPointer(1, 4);// no support for format data 77 } 78 79 public final boolean getCompleteList () { 80 return completeList; 81 } 82 83 public final int getFormatProtectionInformation () { 84 return formatProtectionInformation; 85 } 86 87 public final boolean getLongList () { 88 return longList; 89 } 90 }