Esempio n. 1
0
def main():
    with MockSCSI(MockDevice(spc)) as s:
        # cdb for standard page request
        i = s.inquiry(alloclen=128)
        cdb = i.cdb
        assert cdb[0] == s.device.opcodes.INQUIRY.value
        assert cdb[1:3] == bytearray(2)
        assert scsi_ba_to_int(cdb[3:5]) == 128
        assert cdb[5] == 0
        cdb = i.unmarshall_cdb(cdb)
        assert cdb['opcode'] == s.device.opcodes.INQUIRY.value
        assert cdb['evpd'] == 0
        assert cdb['page_code'] == 0
        assert cdb['alloc_len'] == 128

        d = Inquiry.unmarshall_cdb(Inquiry.marshall_cdb(cdb))
        assert d == cdb

        # supported vpd pages
        i = s.inquiry(evpd=1, page_code=0x88, alloclen=300)
        cdb = i.cdb
        assert cdb[0] == s.device.opcodes.INQUIRY.value
        assert cdb[1] == 0x01
        assert cdb[2] == 0x88
        assert scsi_ba_to_int(cdb[3:5]) == 300
        assert cdb[5] == 0
        cdb = i.unmarshall_cdb(cdb)
        assert cdb['opcode'] == s.device.opcodes.INQUIRY.value
        assert cdb['evpd'] == 1
        assert cdb['page_code'] == 0x88
        assert cdb['alloc_len'] == 300

        d = Inquiry.unmarshall_cdb(Inquiry.marshall_cdb(cdb))
        assert d == cdb
def main():

    with MockSCSI(MockDevice(smc)) as s:
        # cdb for SMC: ReadElementStatus
        r = s.readelementstatus(
            300,
            700,
            element_type=READELEMENTSTATUS.ELEMENT_TYPE.STORAGE,
            voltag=1,
            curdata=1,
            dvcid=1)
        cdb = r.cdb
        assert cdb[0] == s.device.opcodes.READ_ELEMENT_STATUS.value
        assert cdb[1] == 0x10 | READELEMENTSTATUS.ELEMENT_TYPE.STORAGE
        assert scsi_ba_to_int(cdb[2:4]) == 300
        assert scsi_ba_to_int(cdb[4:6]) == 700
        assert cdb[6] == 0x03
        assert scsi_ba_to_int(cdb[7:10]) == 16384
        cdb = r.unmarshall_cdb(cdb)
        assert cdb['opcode'] == s.device.opcodes.READ_ELEMENT_STATUS.value
        assert cdb['voltag'] == 1
        assert cdb['element_type'] == READELEMENTSTATUS.ELEMENT_TYPE.STORAGE
        assert cdb['starting_element_address'] == 300
        assert cdb['num_elements'] == 700
        assert cdb['curdata'] == 1
        assert cdb['dvcid'] == 1
        assert cdb['alloc_len'] == 16384

        d = ReadElementStatus.unmarshall_cdb(
            ReadElementStatus.marshall_cdb(cdb))
        assert d == cdb
def main():
    dev = MockReadElementStatus()
    dev.opcodes = smc
    s = SCSI(dev)
    s.device.opcodes = smc
    # cdb for SMC: ReadElementStatus
    r = s.readelementstatus(300, 700, element_type=READELEMENTSTATUS.ELEMENT_TYPE.STORAGE, voltag=1, curdata=1, dvcid=1)
    cdb = r.cdb
    assert cdb[0] == s.device.opcodes.READ_ELEMENT_STATUS.value
    assert cdb[1] == 0x10 | READELEMENTSTATUS.ELEMENT_TYPE.STORAGE
    assert scsi_ba_to_int(cdb[2:4]) == 300
    assert scsi_ba_to_int(cdb[4:6]) == 700
    assert cdb[6] == 0x03
    assert scsi_ba_to_int(cdb[7:10]) == 16384
    cdb = r.unmarshall_cdb(cdb)
    assert cdb['opcode'] == s.device.opcodes.READ_ELEMENT_STATUS.value
    assert cdb['voltag'] == 1
    assert cdb['element_type'] == READELEMENTSTATUS.ELEMENT_TYPE.STORAGE
    assert cdb['starting_element_address'] == 300
    assert cdb['num_elements'] == 700
    assert cdb['curdata'] == 1
    assert cdb['dvcid'] == 1
    assert cdb['alloc_len'] == 16384

    d = ReadElementStatus.unmarshall_cdb(ReadElementStatus.marshall_cdb(cdb))
    assert d == cdb
Esempio n. 4
0
    def test_main(self):
        with MockSCSI(MockDevice(spc)) as s:
            # cdb for standard page request
            i = s.inquiry(alloclen=128)
            cdb = i.cdb
            self.assertEqual(cdb[0], s.device.opcodes.INQUIRY.value)
            self.assertEqual(cdb[1:3], bytearray(2))
            self.assertEqual(scsi_ba_to_int(cdb[3:5]), 128)
            self.assertEqual(cdb[5], 0)
            cdb = i.unmarshall_cdb(cdb)
            self.assertEqual(cdb['opcode'], s.device.opcodes.INQUIRY.value)
            self.assertEqual(cdb['evpd'], 0)
            self.assertEqual(cdb['page_code'], 0)
            self.assertEqual(cdb['alloc_len'], 128)

            d = Inquiry.unmarshall_cdb(Inquiry.marshall_cdb(cdb))
            self.assertEqual(d, cdb)

            # supported vpd pages
            i = s.inquiry(evpd=1, page_code=0x88, alloclen=300)
            cdb = i.cdb
            self.assertEqual(cdb[0], s.device.opcodes.INQUIRY.value)
            self.assertEqual(cdb[1], 0x01)
            self.assertEqual(cdb[2], 0x88)
            self.assertEqual(scsi_ba_to_int(cdb[3:5]), 300)
            self.assertEqual(cdb[5], 0)
            cdb = i.unmarshall_cdb(cdb)
            self.assertEqual(cdb['opcode'], s.device.opcodes.INQUIRY.value)
            self.assertEqual(cdb['evpd'], 1)
            self.assertEqual(cdb['page_code'], 0x88)
            self.assertEqual(cdb['alloc_len'], 300)

            d = Inquiry.unmarshall_cdb(Inquiry.marshall_cdb(cdb))
            self.assertEqual(d, cdb)
Esempio n. 5
0
def main():
    with MockSCSI(MockDevice(spc)) as s:
        # cdb for standard page request
        i = s.inquiry(alloclen=128)
        cdb = i.cdb
        assert cdb[0] == s.device.opcodes.INQUIRY.value
        assert cdb[1:3] == bytearray(2)
        assert scsi_ba_to_int(cdb[3:5]) == 128
        assert cdb[5] == 0
        cdb = i.unmarshall_cdb(cdb)
        assert cdb['opcode'] == s.device.opcodes.INQUIRY.value
        assert cdb['evpd'] == 0
        assert cdb['page_code'] == 0
        assert cdb['alloc_len'] == 128

        d = Inquiry.unmarshall_cdb(Inquiry.marshall_cdb(cdb))
        assert d == cdb

        # supported vpd pages
        i = s.inquiry(evpd=1, page_code=0x88, alloclen=300)
        cdb = i.cdb
        assert cdb[0] == s.device.opcodes.INQUIRY.value
        assert cdb[1] == 0x01
        assert cdb[2] == 0x88
        assert scsi_ba_to_int(cdb[3:5]) == 300
        assert cdb[5] == 0
        cdb = i.unmarshall_cdb(cdb)
        assert cdb['opcode'] == s.device.opcodes.INQUIRY.value
        assert cdb['evpd'] == 1
        assert cdb['page_code'] == 0x88
        assert cdb['alloc_len'] == 300

        d = Inquiry.unmarshall_cdb(Inquiry.marshall_cdb(cdb))
        assert d == cdb
Esempio n. 6
0
    def test_main(self):

        with MockSCSI(MockDevice(smc)) as s:
            # cdb for SMC: ReadElementStatus
            r = s.readelementstatus(
                300,
                700,
                element_type=READELEMENTSTATUS.ELEMENT_TYPE.STORAGE,
                voltag=1,
                curdata=1,
                dvcid=1)
            cdb = r.cdb
            self.assertEqual(cdb[0],
                             s.device.opcodes.READ_ELEMENT_STATUS.value)
            self.assertEqual(cdb[1],
                             0x10 | READELEMENTSTATUS.ELEMENT_TYPE.STORAGE)
            self.assertEqual(scsi_ba_to_int(cdb[2:4]), 300)
            self.assertEqual(scsi_ba_to_int(cdb[4:6]), 700)
            self.assertEqual(cdb[6], 0x03)
            self.assertEqual(scsi_ba_to_int(cdb[7:10]), 16384)
            cdb = r.unmarshall_cdb(cdb)
            self.assertEqual(cdb['opcode'],
                             s.device.opcodes.READ_ELEMENT_STATUS.value)
            self.assertEqual(cdb['voltag'], 1)
            self.assertEqual(cdb['element_type'],
                             READELEMENTSTATUS.ELEMENT_TYPE.STORAGE)
            self.assertEqual(cdb['starting_element_address'], 300)
            self.assertEqual(cdb['num_elements'], 700)
            self.assertEqual(cdb['curdata'], 1)
            self.assertEqual(cdb['dvcid'], 1)
            self.assertEqual(cdb['alloc_len'], 16384)

            d = ReadElementStatus.unmarshall_cdb(
                ReadElementStatus.marshall_cdb(cdb))
            self.assertEqual(d, cdb)
def main():
    dev = MockMoveMedium()
    dev.opcodes = smc
    s = SCSI(dev)
    s.device.opcodes = smc
    m = s.exchangemedium(15, 32, 64, 32, inv1=1)
    cdb = m.cdb
    assert cdb[0] == s.device.opcodes.EXCHANGE_MEDIUM.value
    assert cdb[1] == 0
    assert scsi_ba_to_int(cdb[2:4]) == 15
    assert scsi_ba_to_int(cdb[4:6]) == 32
    assert scsi_ba_to_int(cdb[6:8]) == 64
    assert scsi_ba_to_int(cdb[8:10]) == 32
    assert cdb[10] == 0x02
    cdb = m.unmarshall_cdb(cdb)
    assert cdb['opcode'] == s.device.opcodes.EXCHANGE_MEDIUM.value
    assert cdb['medium_transport_address'] == 15
    assert cdb['source_address'] == 32
    assert cdb['first_destination_address'] == 64
    assert cdb['second_destination_address'] == 32
    assert cdb['inv1'] == 1
    assert cdb['inv2'] == 0

    d = ExchangeMedium.unmarshall_cdb(ExchangeMedium.marshall_cdb(cdb))
    assert d == cdb
def main():
    dev = MockMoveMedium()
    dev.opcodes = smc
    s = SCSI(dev)
    s.device.opcodes = smc
    m = s.exchangemedium(15, 32, 64, 32, inv1=1)
    cdb = m.cdb
    assert cdb[0] == s.device.opcodes.EXCHANGE_MEDIUM.value
    assert cdb[1] == 0
    assert scsi_ba_to_int(cdb[2:4]) == 15
    assert scsi_ba_to_int(cdb[4:6]) == 32
    assert scsi_ba_to_int(cdb[6:8]) == 64
    assert scsi_ba_to_int(cdb[8:10]) == 32
    assert cdb[10] == 0x02
    cdb = m.unmarshall_cdb(cdb)
    assert cdb['opcode'] == s.device.opcodes.EXCHANGE_MEDIUM.value
    assert cdb['medium_transport_address'] == 15
    assert cdb['source_address'] == 32
    assert cdb['first_destination_address'] == 64
    assert cdb['second_destination_address'] == 32
    assert cdb['inv1'] == 1
    assert cdb['inv2'] == 0

    d = ExchangeMedium.unmarshall_cdb(ExchangeMedium.marshall_cdb(cdb))
    assert d == cdb
Esempio n. 9
0
    def unmarshall_designator(cls, _type, data):
        """
        static helper method to unmarshall designator data

        :param _type: type of the designator
        :param data: a byte array with designator data
        :return: a dict
        """
        _d = {}
        if _type == cls.DESIGNATOR.VENDOR_SPECIFIC:
            _d['vendor_specific'] = data

        if _type == cls.DESIGNATOR.T10_VENDOR_ID:
            _d['t10_vendor_id'] = data[:8]
            _d['vendor_specific_id'] = data[8:]

        if _type == cls.DESIGNATOR.EUI_64:
            if len(data) == 8:
                _d['ieee_company_id'] = convert.scsi_ba_to_int(data[:3])
                _d['vendor_specific_extension_id'] = data[3:8]
            if len(data) == 12:
                _d['ieee_company_id'] = convert.scsi_ba_to_int(data[:3])
                _d['vendor_specific_extension_id'] = data[3:8]
                _d['directory_id'] = data[8:]
            if len(data) == 16:
                _d['identifier_extension'] = data[:8]
                _d['ieee_company_id'] = convert.scsi_ba_to_int(data[8:11])
                _d['vendor_specific_extension_id'] = data[11:]

        if _type == cls.DESIGNATOR.NAA:
            convert.decode_bits(data, cls._naa_type_bits, _d)
            if _d['naa'] == cls.NAA.IEEE_EXTENDED:
                convert.decode_bits(data, cls._naa_ieee_extended_bits, _d)
            if _d['naa'] == cls.NAA.LOCALLY_ASSIGNED:
                convert.decode_bits(data, cls._naa_locally_assigned_bits, _d)
            if _d['naa'] == cls.NAA.IEEE_REGISTERED:
                convert.decode_bits(data, cls._naa_ieee_registered_bits, _d)
            if _d['naa'] == cls.NAA.IEEE_REGISTERED_EXTENDED:
                convert.decode_bits(data,
                                    cls._naa_ieee_registered_extended_bits, _d)

        if _type == cls.DESIGNATOR.RELATIVE_TARGET_PORT_IDENTIFIER:
            convert.decode_bits(data, cls._relative_port_bits, _d)

        if _type == cls.DESIGNATOR.TARGET_PORTAL_GROUP:
            convert.decode_bits(data, cls._target_portal_group_bits, _d)

        if _type == cls.DESIGNATOR.LOGICAL_UNIT_GROUP:
            convert.decode_bits(data, cls._logical_unit_group_bits, _d)

        if _type == cls.DESIGNATOR.MD5_LOGICAL_IDENTIFIER:
            _d['md5_logical_identifier'] = data[0:16]

        if _type == cls.DESIGNATOR.SCSI_NAME_STRING:
            _d['scsi_name_string'] = data

        if _type == cls.DESIGNATOR.PCI_EXPRESS_ROUTING_ID:
            convert.decode_bits(data, cls._pci_express_routing_id_bits, _d)
        return _d
Esempio n. 10
0
    def unmarshall_datain(data):
        """
        Unmarshall the ReadElementStatus datain buffer.

        :param data: a byte array
        :return result: a dict
        """
        result = {}
        _esd = []
        decode_bits(data, ReadElementStatus._datain_bits, result)

        #
        # Loop over the remaining data until we have consumed all
        # element status pages
        #
        _bc = scsi_ba_to_int(data[5:8])
        data = data[8:8 + _bc]
        while len(data):
            _r = {}
            _bc = scsi_ba_to_int(data[5:8])
            _edl = scsi_ba_to_int(data[2:4])

            decode_bits(data, ReadElementStatus._element_status_page_bits, _r)
            _d = data[8:8 + _bc]
            _ed = []
            while len(_d):
                _rr = {}

                decode_bits(_d,
                            ReadElementStatus._element_status_descriptor_bits,
                            _rr)
                _dd = _d[12:]
                if _r['pvoltag']:
                    _rr.update({'primary_volume_tag': _dd[0:36]})
                    _dd = _dd[36:]
                if _r['avoltag']:
                    _rr.update({'alternate_volume_tag': _dd[0:36]})
                    _dd = _dd[
                        36:]  # this is not going to used again so we may just delete it?

                if _r['element_type'] == readelementstatus_enums.ELEMENT_TYPE.DATA_TRANSFER:
                    decode_bits(
                        _d, ReadElementStatus._data_transfer_descriptor_bits,
                        _rr)
                if _r['element_type'] == readelementstatus_enums.ELEMENT_TYPE.STORAGE:
                    decode_bits(_d, ReadElementStatus._storage_descriptor_bits,
                                _rr)
                if _r['element_type'] == readelementstatus_enums.ELEMENT_TYPE.IMPORT_EXPORT:
                    decode_bits(
                        _d, ReadElementStatus._import_export_descriptor_bits,
                        _rr)
                _ed.append(_rr)
                _d = _d[_edl:]
            _r.update({'element_descriptors': _ed})
            _esd.append(_r)
            data = data[8 + _bc:]
        result.update({'element_status_pages': _esd})
        return result
Esempio n. 11
0
    def unmarshall_designator(type, data):
        _d = {}
        if type == inquiry_enums.DESIGNATOR.VENDOR_SPECIFIC:
            _d['vendor_specific'] = data

        if type == inquiry_enums.DESIGNATOR.T10_VENDOR_ID:
            _d['t10_vendor_id'] = data[:8]
            _d['vendor_specific_id'] = data[8:]

        if type == inquiry_enums.DESIGNATOR.EUI_64:
            if len(data) == 8:
                _d['ieee_company_id'] = scsi_ba_to_int(data[:3])
                _d['vendor_specific_extension_id'] = data[3:8]
            if len(data) == 12:
                _d['ieee_company_id'] = scsi_ba_to_int(data[:3])
                _d['vendor_specific_extension_id'] = data[3:8]
                _d['directory_id'] = data[8:]
            if len(data) == 16:
                _d['identifier_extension'] = data[:8]
                _d['ieee_company_id'] = scsi_ba_to_int(data[8:11])
                _d['vendor_specific_extension_id'] = data[11:]

        if type == inquiry_enums.DESIGNATOR.NAA:
            decode_bits(data, Inquiry._naa_type_bits, _d)
            if _d['naa'] == inquiry_enums.NAA.IEEE_EXTENDED:
                decode_bits(data, Inquiry._naa_ieee_extended_bits, _d)
            if _d['naa'] == inquiry_enums.NAA.LOCALLY_ASSIGNED:
                decode_bits(data, Inquiry._naa_locally_assigned_bits, _d)
            if _d['naa'] == inquiry_enums.NAA.IEEE_REGISTERED:
                decode_bits(data, Inquiry._naa_ieee_registered_bits, _d)
            if _d['naa'] == inquiry_enums.NAA.IEEE_REGISTERED_EXTENDED:
                decode_bits(data, Inquiry._naa_ieee_registered_extended_bits,
                            _d)

        if type == inquiry_enums.DESIGNATOR.RELATIVE_TARGET_PORT_IDENTIFIER:
            decode_bits(data, Inquiry._relative_port_bits, _d)

        if type == inquiry_enums.DESIGNATOR.TARGET_PORTAL_GROUP:
            decode_bits(data, Inquiry._target_portal_group_bits, _d)

        if type == inquiry_enums.DESIGNATOR.LOGICAL_UNIT_GROUP:
            decode_bits(data, Inquiry._logical_unit_group_bits, _d)

        if type == inquiry_enums.DESIGNATOR.MD5_LOGICAL_IDENTIFIER:
            _d['md5_logical_identifier'] = data[0:16]

        if type == inquiry_enums.DESIGNATOR.SCSI_NAME_STRING:
            _d['scsi_name_string'] = data

        if type == inquiry_enums.DESIGNATOR.PCI_EXPRESS_ROUTING_ID:
            decode_bits(data, Inquiry._pci_express_routing_id_bits, _d)

        return _d
Esempio n. 12
0
    def unmarshall_designator(type, data):
        _d = {}
        if type == inquiry_enums.DESIGNATOR.VENDOR_SPECIFIC:
            _d['vendor_specific'] = data

        if type == inquiry_enums.DESIGNATOR.T10_VENDOR_ID:
            _d['t10_vendor_id'] = data[:8]
            _d['vendor_specific_id'] = data[8:]

        if type == inquiry_enums.DESIGNATOR.EUI_64:
            if len(data) == 8:
                _d['ieee_company_id'] = scsi_ba_to_int(data[:3])
                _d['vendor_specific_extension_id'] = data[3:8]
            if len(data) == 12:
                _d['ieee_company_id'] = scsi_ba_to_int(data[:3])
                _d['vendor_specific_extension_id'] = data[3:8]
                _d['directory_id'] = data[8:]
            if len(data) == 16:
                _d['identifier_extension'] = data[:8]
                _d['ieee_company_id'] = scsi_ba_to_int(data[8:11])
                _d['vendor_specific_extension_id'] = data[11:]

        if type == inquiry_enums.DESIGNATOR.NAA:
            decode_bits(data, Inquiry._naa_type_bits, _d)
            if _d['naa'] == inquiry_enums.NAA.IEEE_EXTENDED:
                decode_bits(data, Inquiry._naa_ieee_extended_bits, _d)
            if _d['naa'] == inquiry_enums.NAA.LOCALLY_ASSIGNED:
                decode_bits(data, Inquiry._naa_locally_assigned_bits, _d)
            if _d['naa'] == inquiry_enums.NAA.IEEE_REGISTERED:
                decode_bits(data, Inquiry._naa_ieee_registered_bits, _d)
            if _d['naa'] == inquiry_enums.NAA.IEEE_REGISTERED_EXTENDED:
                decode_bits(data, Inquiry._naa_ieee_registered_extended_bits, _d)

        if type == inquiry_enums.DESIGNATOR.RELATIVE_TARGET_PORT_IDENTIFIER:
            decode_bits(data, Inquiry._relative_port_bits, _d)

        if type == inquiry_enums.DESIGNATOR.TARGET_PORTAL_GROUP:
            decode_bits(data, Inquiry._target_portal_group_bits, _d)

        if type == inquiry_enums.DESIGNATOR.LOGICAL_UNIT_GROUP:
            decode_bits(data, Inquiry._logical_unit_group_bits, _d)

        if type == inquiry_enums.DESIGNATOR.MD5_LOGICAL_IDENTIFIER:
            _d['md5_logical_identifier'] = data[0:16]

        if type == inquiry_enums.DESIGNATOR.SCSI_NAME_STRING:
            _d['scsi_name_string'] = data

        if type == inquiry_enums.DESIGNATOR.PCI_EXPRESS_ROUTING_ID:
            decode_bits(data, Inquiry._pci_express_routing_id_bits, _d)

        return _d
Esempio n. 13
0
def main():
    dev = MockModeSense10()
    dev.opcodes = smc
    s = SCSI(dev)

    # cdb for SMC: ElementAddressAssignment
    m = s.modesense10(
        page_code=MODESENSE10.PAGE_CODE.ELEMENT_ADDRESS_ASSIGNMENT)
    cdb = m.cdb
    assert cdb[0] == s.device.opcodes.MODE_SENSE_10.value
    assert cdb[1] == 0
    assert cdb[2] == MODESENSE10.PAGE_CODE.ELEMENT_ADDRESS_ASSIGNMENT
    assert cdb[3] == 0
    assert cdb[4:6] == bytearray(2)
    assert scsi_ba_to_int(cdb[7:9]) == 96
    assert cdb[9] == 0
    cdb = m.unmarshall_cdb(cdb)
    assert cdb['opcode'] == s.device.opcodes.MODE_SENSE_10.value
    assert cdb['dbd'] == 0
    assert cdb['llbaa'] == 0
    assert cdb['page_code'] == MODESENSE10.PAGE_CODE.ELEMENT_ADDRESS_ASSIGNMENT
    assert cdb['pc'] == 0
    assert cdb['sub_page_code'] == 0
    assert cdb['alloc_len'] == 96

    d = ModeSense10.unmarshall_cdb(ModeSense10.marshall_cdb(cdb))
    assert d == cdb

    m = s.modesense10(page_code=0,
                      sub_page_code=3,
                      llbaa=1,
                      dbd=1,
                      pc=MODESENSE10.PC.DEFAULT,
                      alloclen=90)
    cdb = m.cdb
    assert cdb[0] == s.device.opcodes.MODE_SENSE_10.value
    assert cdb[1] == 0x18
    assert cdb[2] == MODESENSE10.PC.DEFAULT << 6
    assert cdb[3] == 3
    assert scsi_ba_to_int(cdb[7:9]) == 90
    cdb = m.unmarshall_cdb(cdb)
    assert cdb['opcode'] == s.device.opcodes.MODE_SENSE_10.value
    assert cdb['dbd'] == 1
    assert cdb['pc'] == MODESENSE10.PC.DEFAULT
    assert cdb['page_code'] == 0
    assert cdb['sub_page_code'] == 3
    assert cdb['alloc_len'] == 90
    assert cdb['llbaa'] == 1

    d = ModeSense10.unmarshall_cdb(ModeSense10.marshall_cdb(cdb))
    assert d == cdb
    def unmarshall_datain(data):
        """
        """
        result = {}
        _esd = []
        decode_bits(data, ReadElementStatus._datain_bits, result)

        #
        # Loop over the remaining data until we have consumed all
        # element status pages
        #
        _bc = scsi_ba_to_int(data[5:8])
        data = data[8:8 + _bc]
        while len(data):
            _r = {}
            _bc = scsi_ba_to_int(data[5:8])
            _edl = scsi_ba_to_int(data[2:4])

            decode_bits(data, ReadElementStatus._element_status_page_bits, _r)
            _d = data[8:8 + _bc]
            _ed = []
            while len(_d):
                _rr = {}

                decode_bits(_d, ReadElementStatus._element_status_descriptor_bits, _rr)
                _dd = _d[12:]
                if _r['pvoltag']:
                    _rr.update({'primary_volume_tag': _dd[0:36]})
                    _dd = _dd[36:]
                if _r['avoltag']:
                    _rr.update({'alternate_volume_tag': _dd[0:36]})
                    _dd = _dd[36:]

                if _r['element_type'] == readelementstatus_enums.ELEMENT_TYPE.DATA_TRANSFER:
                    decode_bits(_d, ReadElementStatus._data_transfer_descriptor_bits, _rr)
                if _r['element_type'] == readelementstatus_enums.ELEMENT_TYPE.STORAGE:
                    decode_bits(_d, ReadElementStatus._storage_descriptor_bits, _rr)
                if _r['element_type'] == readelementstatus_enums.ELEMENT_TYPE.IMPORT_EXPORT:
                    decode_bits(_d, ReadElementStatus._import_export_descriptor_bits, _rr)

                _ed.append(_rr)
                _d = _d[_edl:]

            _r.update({'element_descriptors': _ed})
            _esd.append(_r)

            data = data[8 + _bc:]

        result.update({'element_status_pages': _esd})
        return result
Esempio n. 15
0
    def unmarshall_datain(data):
        """
        Unmarshall the ReportLuns datain buffer.

        :param data: a byte array
        :return result: a dic
        """
        result = {}
        _data = data[8:scsi_ba_to_int(data[:4]) + 4]
        _luns = []
        _count = 0
        while len(_data):
            #  maybe we drop the whole "put a dict into the list for every lun" thing at all
            _r = {}
            decode_bits(_data[:8],
                        ReportLuns._datain_bits,
                        _r)
            key = 'lun%s' % _count
            _r[key] = _r.pop('lun')
            _luns.append(_r)
            _data = _data[8:]
            _count += 1

        result.update({'luns': _luns})
        return result
Esempio n. 16
0
def main():
    dev = MockWrite12()
    dev.opcodes = sbc
    s = SCSI(dev)
    s.blocksize = 512

    data = bytearray(27 * 512)

    w = s.write12(1024, 27, data)
    cdb = w.cdb
    assert cdb[0] == s.device.opcodes.WRITE_12.value
    assert cdb[1] == 0
    assert scsi_ba_to_int(cdb[2:6]) == 1024
    assert scsi_ba_to_int(cdb[6:10]) == 27
    assert cdb[10] == 0
    assert cdb[11] == 0
    cdb = w.unmarshall_cdb(cdb)
    assert cdb['opcode'] == s.device.opcodes.WRITE_12.value
    assert cdb['wrprotect'] == 0
    assert cdb['dpo'] == 0
    assert cdb['fua'] == 0
    assert cdb['lba'] == 1024
    assert cdb['group'] == 0
    assert cdb['tl'] == 27

    d = Write12.unmarshall_cdb(Write12.marshall_cdb(cdb))
    assert d == cdb

    w = s.write12(65536, 27, data, wrprotect=2, dpo=1, fua=1, group=19)
    cdb = w.cdb
    assert cdb[0] == s.device.opcodes.WRITE_12.value
    assert cdb[1] == 0x58
    assert scsi_ba_to_int(cdb[2:6]) == 65536
    assert scsi_ba_to_int(cdb[6:10]) == 27
    assert cdb[10] == 0x13
    assert cdb[11] == 0
    cdb = w.unmarshall_cdb(cdb)
    assert cdb['opcode'] == s.device.opcodes.WRITE_12.value
    assert cdb['wrprotect'] == 2
    assert cdb['dpo'] == 1
    assert cdb['fua'] == 1
    assert cdb['lba'] == 65536
    assert cdb['group'] == 19
    assert cdb['tl'] == 27

    d = Write12.unmarshall_cdb(Write12.marshall_cdb(cdb))
    assert d == cdb
Esempio n. 17
0
def main():
    dev = MockRead16()
    dev.opcodes = sbc
    s = SCSI(dev)
    s.blocksize = 512

    r = s.read16(1024, 27)
    cdb = r.cdb
    assert cdb[0] == s.device.opcodes.READ_16.value
    assert cdb[1] == 0
    assert scsi_ba_to_int(cdb[2:10]) == 1024
    assert scsi_ba_to_int(cdb[10:14]) == 27
    assert cdb[14] == 0
    assert cdb[15] == 0
    cdb = r.unmarshall_cdb(cdb)
    assert cdb['opcode'] == s.device.opcodes.READ_16.value
    assert cdb['rdprotect'] == 0
    assert cdb['dpo'] == 0
    assert cdb['fua'] == 0
    assert cdb['rarc'] == 0
    assert cdb['lba'] == 1024
    assert cdb['group'] == 0
    assert cdb['tl'] == 27

    d = Read16.unmarshall_cdb(Read16.marshall_cdb(cdb))
    assert d == cdb

    r = s.read16(1024, 27, rdprotect=2, dpo=1, fua=1, rarc=1, group=19)
    cdb = r.cdb
    assert cdb[0] == s.device.opcodes.READ_16.value
    assert cdb[1] == 0x5c
    assert scsi_ba_to_int(cdb[2:10]) == 1024
    assert scsi_ba_to_int(cdb[10:14]) == 27
    assert cdb[14] == 0x13
    assert cdb[15] == 0
    cdb = r.unmarshall_cdb(cdb)
    assert cdb['opcode'] == s.device.opcodes.READ_16.value
    assert cdb['rdprotect'] == 2
    assert cdb['dpo'] == 1
    assert cdb['fua'] == 1
    assert cdb['rarc'] == 1
    assert cdb['lba'] == 1024
    assert cdb['group'] == 19
    assert cdb['tl'] == 27

    d = Read16.unmarshall_cdb(Read16.marshall_cdb(cdb))
    assert d == cdb
Esempio n. 18
0
def main():
    dev = MockWrite12()
    dev.opcodes = sbc
    s = SCSI(dev)
    s.blocksize = 512

    data = bytearray(27 * 512)

    w = s.write12(1024, 27, data)
    cdb = w.cdb
    assert cdb[0] == s.device.opcodes.WRITE_12.value
    assert cdb[1] == 0
    assert scsi_ba_to_int(cdb[2:6]) == 1024
    assert scsi_ba_to_int(cdb[6:10]) == 27
    assert cdb[10] == 0
    assert cdb[11] == 0
    cdb = w.unmarshall_cdb(cdb)
    assert cdb['opcode'] == s.device.opcodes.WRITE_12.value
    assert cdb['wrprotect'] == 0
    assert cdb['dpo'] == 0
    assert cdb['fua'] == 0
    assert cdb['lba'] == 1024
    assert cdb['group'] == 0
    assert cdb['tl'] == 27

    d = Write12.unmarshall_cdb(Write12.marshall_cdb(cdb))
    assert d == cdb

    w = s.write12(65536, 27, data, wrprotect=2, dpo=1, fua=1, group=19)
    cdb = w.cdb
    assert cdb[0] == s.device.opcodes.WRITE_12.value
    assert cdb[1] == 0x58
    assert scsi_ba_to_int(cdb[2:6]) == 65536
    assert scsi_ba_to_int(cdb[6:10]) == 27
    assert cdb[10] == 0x13
    assert cdb[11] == 0
    cdb = w.unmarshall_cdb(cdb)
    assert cdb['opcode'] == s.device.opcodes.WRITE_12.value
    assert cdb['wrprotect'] == 2
    assert cdb['dpo'] == 1
    assert cdb['fua'] == 1
    assert cdb['lba'] == 65536
    assert cdb['group'] == 19
    assert cdb['tl'] == 27

    d = Write12.unmarshall_cdb(Write12.marshall_cdb(cdb))
    assert d == cdb
Esempio n. 19
0
def main():

    with MockSCSI(MockDevice(sbc)) as s:
        s.blocksize = 512

        r = s.read12(1024, 27)
        cdb = r.cdb
        assert cdb[0] == s.device.opcodes.READ_12.value
        assert cdb[1] == 0
        assert scsi_ba_to_int(cdb[2:6]) == 1024
        assert scsi_ba_to_int(cdb[6:10]) == 27
        assert cdb[10] == 0
        assert cdb[11] == 0
        cdb = r.unmarshall_cdb(cdb)
        assert cdb['opcode'] == s.device.opcodes.READ_12.value
        assert cdb['rdprotect'] == 0
        assert cdb['dpo'] == 0
        assert cdb['fua'] == 0
        assert cdb['rarc'] == 0
        assert cdb['lba'] == 1024
        assert cdb['group'] == 0
        assert cdb['tl'] == 27

        d = Read12.unmarshall_cdb(Read12.marshall_cdb(cdb))
        assert d == cdb

        r = s.read12(1024, 27, rdprotect=2, dpo=1, fua=1, rarc=1, group=19)
        cdb = r.cdb
        assert cdb[0] == s.device.opcodes.READ_12.value
        assert cdb[1] == 0x5c
        assert scsi_ba_to_int(cdb[2:6]) == 1024
        assert scsi_ba_to_int(cdb[6:10]) == 27
        assert cdb[10] == 0x13
        assert cdb[11] == 0
        cdb = r.unmarshall_cdb(cdb)
        assert cdb['opcode'] == s.device.opcodes.READ_12.value
        assert cdb['rdprotect'] == 2
        assert cdb['dpo'] == 1
        assert cdb['fua'] == 1
        assert cdb['rarc'] == 1
        assert cdb['lba'] == 1024
        assert cdb['group'] == 19
        assert cdb['tl'] == 27

        d = Read12.unmarshall_cdb(Read12.marshall_cdb(cdb))
        assert d == cdb
Esempio n. 20
0
def main():

    with MockSCSI(MockDevice(sbc)) as s:
        s.blocksize = 512

        r = s.read12(1024, 27)
        cdb = r.cdb
        assert cdb[0] == s.device.opcodes.READ_12.value
        assert cdb[1] == 0
        assert scsi_ba_to_int(cdb[2:6]) == 1024
        assert scsi_ba_to_int(cdb[6:10]) == 27
        assert cdb[10] == 0
        assert cdb[11] == 0
        cdb = r.unmarshall_cdb(cdb)
        assert cdb['opcode'] == s.device.opcodes.READ_12.value
        assert cdb['rdprotect'] == 0
        assert cdb['dpo'] == 0
        assert cdb['fua'] == 0
        assert cdb['rarc'] == 0
        assert cdb['lba'] == 1024
        assert cdb['group'] == 0
        assert cdb['tl'] == 27

        d = Read12.unmarshall_cdb(Read12.marshall_cdb(cdb))
        assert d == cdb

        r = s.read12(1024, 27, rdprotect=2, dpo=1, fua=1, rarc=1, group=19)
        cdb = r.cdb
        assert cdb[0] == s.device.opcodes.READ_12.value
        assert cdb[1] == 0x5c
        assert scsi_ba_to_int(cdb[2:6]) == 1024
        assert scsi_ba_to_int(cdb[6:10]) == 27
        assert cdb[10] == 0x13
        assert cdb[11] == 0
        cdb = r.unmarshall_cdb(cdb)
        assert cdb['opcode'] == s.device.opcodes.READ_12.value
        assert cdb['rdprotect'] == 2
        assert cdb['dpo'] == 1
        assert cdb['fua'] == 1
        assert cdb['rarc'] == 1
        assert cdb['lba'] == 1024
        assert cdb['group'] == 19
        assert cdb['tl'] == 27

        d = Read12.unmarshall_cdb(Read12.marshall_cdb(cdb))
        assert d == cdb
Esempio n. 21
0
def main():

    with MockSCSI(MockDevice(sbc)) as s:
        s.blocksize = 512

        data = bytearray(27 * 512)

        w = s.write10(1024, 27, data)
        cdb = w.cdb
        assert cdb[0] == s.device.opcodes.WRITE_10.value
        assert cdb[1] == 0
        assert scsi_ba_to_int(cdb[2:6]) == 1024
        assert cdb[6] == 0
        assert scsi_ba_to_int(cdb[7:9]) == 27
        assert cdb[9] == 0
        cdb = w.unmarshall_cdb(cdb)
        assert cdb['opcode'] == s.device.opcodes.WRITE_10.value
        assert cdb['wrprotect'] == 0
        assert cdb['dpo'] == 0
        assert cdb['fua'] == 0
        assert cdb['lba'] == 1024
        assert cdb['group'] == 0
        assert cdb['tl'] == 27

        d = Write10.unmarshall_cdb(Write10.marshall_cdb(cdb))
        assert d == cdb

        w = s.write10(65536, 27, data, wrprotect=2, dpo=1, fua=1, group=19)
        cdb = w.cdb
        assert cdb[0] == s.device.opcodes.WRITE_10.value
        assert cdb[1] == 0x58
        assert scsi_ba_to_int(cdb[2:6]) == 65536
        assert cdb[6] == 0x13
        assert scsi_ba_to_int(cdb[7:9]) == 27
        assert cdb[9] == 0
        cdb = w.unmarshall_cdb(cdb)
        assert cdb['opcode'] == s.device.opcodes.WRITE_10.value
        assert cdb['wrprotect'] == 2
        assert cdb['dpo'] == 1
        assert cdb['fua'] == 1
        assert cdb['lba'] == 65536
        assert cdb['group'] == 19
        assert cdb['tl'] == 27

        d = Write10.unmarshall_cdb(Write10.marshall_cdb(cdb))
        assert d == cdb
def main():
    with MockSCSI(MockDevice(smc)) as s:
        m = s.positiontoelement(15, 32, invert=1)
        cdb = m.cdb
        assert cdb[0] == s.device.opcodes.POSITION_TO_ELEMENT.value
        assert cdb[1] == 0
        assert scsi_ba_to_int(cdb[2:4]) == 15
        assert scsi_ba_to_int(cdb[4:6]) == 32
        assert cdb[8] == 0x01
        cdb = m.unmarshall_cdb(cdb)
        assert cdb['opcode'] == s.device.opcodes.POSITION_TO_ELEMENT.value
        assert cdb['medium_transport_address'] == 15
        assert cdb['destination_address'] == 32
        assert cdb['invert'] == 1

        d = PositionToElement.unmarshall_cdb(PositionToElement.marshall_cdb(cdb))
        assert d == cdb
Esempio n. 23
0
def main():
    dev = MockRead10()
    dev.opcodes = sbc
    s = SCSI(dev)

    r = s.read10(1024, 27)
    cdb = r.cdb
    assert cdb[0] == s.device.opcodes.READ_10.value
    assert cdb[1] == 0
    assert scsi_ba_to_int(cdb[2:6]) == 1024
    assert cdb[6] == 0
    assert scsi_ba_to_int(cdb[7:9]) == 27
    assert cdb[9] == 0
    cdb = r.unmarshall_cdb(cdb)
    assert cdb['opcode'] == s.device.opcodes.READ_10.value
    assert cdb['rdprotect'] == 0
    assert cdb['dpo'] == 0
    assert cdb['fua'] == 0
    assert cdb['rarc'] == 0
    assert cdb['lba'] == 1024
    assert cdb['group'] == 0
    assert cdb['tl'] == 27

    d = Read10.unmarshall_cdb(Read10.marshall_cdb(cdb))
    assert d == cdb

    r = s.read10(1024, 27, rdprotect=2, dpo=1, fua=1, rarc=1, group=19)
    cdb = r.cdb
    assert cdb[0] == s.device.opcodes.READ_10.value
    assert cdb[1] == 0x5c
    assert scsi_ba_to_int(cdb[2:6]) == 1024
    assert cdb[6] == 0x13
    assert scsi_ba_to_int(cdb[7:9]) == 27
    assert cdb[9] == 0
    cdb = r.unmarshall_cdb(cdb)
    assert cdb['opcode'] == s.device.opcodes.READ_10.value
    assert cdb['rdprotect'] == 2
    assert cdb['dpo'] == 1
    assert cdb['fua'] == 1
    assert cdb['rarc'] == 1
    assert cdb['lba'] == 1024
    assert cdb['group'] == 19
    assert cdb['tl'] == 27

    d = Read10.unmarshall_cdb(Read10.marshall_cdb(cdb))
    assert d == cdb
 def unmarshall_datain(data):
     """
     Unmarshall the ReportPriority datain.
     """
     result = {}
     #  get the data after the ppd_len
     _data = data[4:scsi_ba_to_int(data[:4])]
     _descriptors = []
     while len(_data):
         _r = {}
         _dict = dict(ReportPriority._datain_bits.copy)
         _dict.update({'transport_id': [hex(scsi_ba_to_int(_data[6:7])), 8], })
         decode_bits(_data[:8 + scsi_ba_to_int(_data[6:7])], _dict, _r)
         _descriptors.append(_r)
         _data = _data[scsi_ba_to_int(_r['adlen']) + 8:]
     result.update({'priority_descriptors': _descriptors, })
     return result
Esempio n. 25
0
    def test_main(self):

        with MockSCSI(MockDevice(sbc)) as s:
            s.blocksize = 512

            r = s.read12(1024, 27)
            cdb = r.cdb
            self.assertEqual(cdb[0], s.device.opcodes.READ_12.value)
            self.assertEqual(cdb[1], 0)
            self.assertEqual(scsi_ba_to_int(cdb[2:6]), 1024)
            self.assertEqual(scsi_ba_to_int(cdb[6:10]), 27)
            self.assertEqual(cdb[10], 0)
            self.assertEqual(cdb[11], 0)
            cdb = r.unmarshall_cdb(cdb)
            self.assertEqual(cdb['opcode'], s.device.opcodes.READ_12.value)
            self.assertEqual(cdb['rdprotect'], 0)
            self.assertEqual(cdb['dpo'], 0)
            self.assertEqual(cdb['fua'], 0)
            self.assertEqual(cdb['rarc'], 0)
            self.assertEqual(cdb['lba'], 1024)
            self.assertEqual(cdb['group'], 0)
            self.assertEqual(cdb['tl'], 27)

            d = Read12.unmarshall_cdb(Read12.marshall_cdb(cdb))
            self.assertEqual(d, cdb)

            r = s.read12(1024, 27, rdprotect=2, dpo=1, fua=1, rarc=1, group=19)
            cdb = r.cdb
            self.assertEqual(cdb[0], s.device.opcodes.READ_12.value)
            self.assertEqual(cdb[1], 0x5c)
            self.assertEqual(scsi_ba_to_int(cdb[2:6]), 1024)
            self.assertEqual(scsi_ba_to_int(cdb[6:10]), 27)
            self.assertEqual(cdb[10], 0x13)
            self.assertEqual(cdb[11], 0)
            cdb = r.unmarshall_cdb(cdb)
            self.assertEqual(cdb['opcode'], s.device.opcodes.READ_12.value)
            self.assertEqual(cdb['rdprotect'], 2)
            self.assertEqual(cdb['dpo'], 1)
            self.assertEqual(cdb['fua'], 1)
            self.assertEqual(cdb['rarc'], 1)
            self.assertEqual(cdb['lba'], 1024)
            self.assertEqual(cdb['group'], 19)
            self.assertEqual(cdb['tl'], 27)

            d = Read12.unmarshall_cdb(Read12.marshall_cdb(cdb))
            self.assertEqual(d, cdb)
    def test_main(self):
        with MockSCSI(MockDevice(smc)) as s:
            m = s.positiontoelement(15, 32, invert=1)
            cdb = m.cdb
            self.assertEqual(cdb[0], s.device.opcodes.POSITION_TO_ELEMENT.value)
            self.assertEqual(cdb[1], 0)
            self.assertEqual(scsi_ba_to_int(cdb[2:4]), 15)
            self.assertEqual(scsi_ba_to_int(cdb[4:6]), 32)
            self.assertEqual(cdb[8], 0x01)
            cdb = m.unmarshall_cdb(cdb)
            self.assertEqual(cdb['opcode'], s.device.opcodes.POSITION_TO_ELEMENT.value)
            self.assertEqual(cdb['medium_transport_address'], 15)
            self.assertEqual(cdb['destination_address'], 32)
            self.assertEqual(cdb['invert'], 1)

            d = PositionToElement.unmarshall_cdb(PositionToElement.marshall_cdb(cdb))
            self.assertEqual(d, cdb)
Esempio n. 27
0
def main():

    with MockSCSI(MockDevice(sbc)) as s:
        s.blocksize = 512

        data = bytearray(27 * 512)

        w = s.write16(1024, 27, data)
        cdb = w.cdb
        assert cdb[0] == s.device.opcodes.WRITE_16.value
        assert cdb[1] == 0
        assert scsi_ba_to_int(cdb[2:10]) == 1024
        assert scsi_ba_to_int(cdb[10:14]) == 27
        assert cdb[14] == 0
        assert cdb[15] == 0
        cdb = w.unmarshall_cdb(cdb)
        assert cdb['opcode'] == s.device.opcodes.WRITE_16.value
        assert cdb['wrprotect'] == 0
        assert cdb['dpo'] == 0
        assert cdb['fua'] == 0
        assert cdb['lba'] == 1024
        assert cdb['group'] == 0
        assert cdb['tl'] == 27

        d = Write16.unmarshall_cdb(Write16.marshall_cdb(cdb))
        assert d == cdb

        w = s.write16(65536, 27, data, wrprotect=2, dpo=1, fua=1, group=19)
        cdb = w.cdb
        assert cdb[0] == s.device.opcodes.WRITE_16.value
        assert cdb[1] == 0x58
        assert scsi_ba_to_int(cdb[2:10]) == 65536
        assert scsi_ba_to_int(cdb[10:14]) == 27
        assert cdb[14] == 0x13
        assert cdb[15] == 0
        cdb = w.unmarshall_cdb(cdb)
        assert cdb['opcode'] == s.device.opcodes.WRITE_16.value
        assert cdb['wrprotect'] == 2
        assert cdb['dpo'] == 1
        assert cdb['fua'] == 1
        assert cdb['lba'] == 65536
        assert cdb['group'] == 19
        assert cdb['tl'] == 27

        d = Write16.unmarshall_cdb(Write16.marshall_cdb(cdb))
        assert d == cdb
Esempio n. 28
0
    def test_main(self):

        with MockSCSI(MockDevice(sbc)) as s:
            s.blocksize = 512

            data = bytearray(27 * 512)

            w = s.write16(1024, 27, data)
            cdb = w.cdb
            self.assertEqual(cdb[0], s.device.opcodes.WRITE_16.value)
            self.assertEqual(cdb[1], 0)
            self.assertEqual(scsi_ba_to_int(cdb[2:10]), 1024)
            self.assertEqual(scsi_ba_to_int(cdb[10:14]), 27)
            self.assertEqual(cdb[14], 0)
            self.assertEqual(cdb[15], 0)
            cdb = w.unmarshall_cdb(cdb)
            self.assertEqual(cdb['opcode'], s.device.opcodes.WRITE_16.value)
            self.assertEqual(cdb['wrprotect'], 0)
            self.assertEqual(cdb['dpo'], 0)
            self.assertEqual(cdb['fua'], 0)
            self.assertEqual(cdb['lba'], 1024)
            self.assertEqual(cdb['group'], 0)
            self.assertEqual(cdb['tl'], 27)

            d = Write16.unmarshall_cdb(Write16.marshall_cdb(cdb))
            self.assertEqual(d, cdb)

            w = s.write16(65536, 27, data, wrprotect=2, dpo=1, fua=1, group=19)
            cdb = w.cdb
            self.assertEqual(cdb[0], s.device.opcodes.WRITE_16.value)
            self.assertEqual(cdb[1], 0x58)
            self.assertEqual(scsi_ba_to_int(cdb[2:10]), 65536)
            self.assertEqual(scsi_ba_to_int(cdb[10:14]), 27)
            self.assertEqual(cdb[14], 0x13)
            self.assertEqual(cdb[15], 0)
            cdb = w.unmarshall_cdb(cdb)
            self.assertEqual(cdb['opcode'], s.device.opcodes.WRITE_16.value)
            self.assertEqual(cdb['wrprotect'], 2)
            self.assertEqual(cdb['dpo'], 1)
            self.assertEqual(cdb['fua'], 1)
            self.assertEqual(cdb['lba'], 65536)
            self.assertEqual(cdb['group'], 19)
            self.assertEqual(cdb['tl'], 27)

            d = Write16.unmarshall_cdb(Write16.marshall_cdb(cdb))
            self.assertEqual(d, cdb)
def main():
    dev = MockModeSense10()
    dev.opcodes = smc
    s = SCSI(dev)

    # cdb for SMC: ElementAddressAssignment
    m = s.modesense10(page_code=MODESENSE10.PAGE_CODE.ELEMENT_ADDRESS_ASSIGNMENT)
    cdb = m.cdb
    assert cdb[0] == s.device.opcodes.MODE_SENSE_10.value
    assert cdb[1] == 0
    assert cdb[2] == MODESENSE10.PAGE_CODE.ELEMENT_ADDRESS_ASSIGNMENT
    assert cdb[3] == 0
    assert cdb[4:6] == bytearray(2)
    assert scsi_ba_to_int(cdb[7:9]) == 96
    assert cdb[9] == 0
    cdb = m.unmarshall_cdb(cdb)
    assert cdb['opcode'] == s.device.opcodes.MODE_SENSE_10.value
    assert cdb['dbd'] == 0
    assert cdb['llbaa'] == 0
    assert cdb['page_code'] == MODESENSE10.PAGE_CODE.ELEMENT_ADDRESS_ASSIGNMENT
    assert cdb['pc'] == 0
    assert cdb['sub_page_code'] == 0
    assert cdb['alloc_len'] == 96

    d = ModeSense10.unmarshall_cdb(ModeSense10.marshall_cdb(cdb))
    assert d == cdb

    m = s.modesense10(page_code=0, sub_page_code=3, llbaa=1, dbd=1, pc=MODESENSE10.PC.DEFAULT, alloclen=90)
    cdb = m.cdb
    assert cdb[0] == s.device.opcodes.MODE_SENSE_10.value
    assert cdb[1] == 0x18
    assert cdb[2] == MODESENSE10.PC.DEFAULT << 6
    assert cdb[3] == 3
    assert scsi_ba_to_int(cdb[7:9]) == 90
    cdb = m.unmarshall_cdb(cdb)
    assert cdb['opcode'] == s.device.opcodes.MODE_SENSE_10.value
    assert cdb['dbd'] == 1
    assert cdb['pc'] == MODESENSE10.PC.DEFAULT
    assert cdb['page_code'] == 0
    assert cdb['sub_page_code'] == 3
    assert cdb['alloc_len'] == 90
    assert cdb['llbaa'] == 1

    d = ModeSense10.unmarshall_cdb(ModeSense10.marshall_cdb(cdb))
    assert d == cdb
def main():
    with MockSCSI(MockDevice(smc)) as s:
        m = s.positiontoelement(15, 32, invert=1)
        cdb = m.cdb
        assert cdb[0] == s.device.opcodes.POSITION_TO_ELEMENT.value
        assert cdb[1] == 0
        assert scsi_ba_to_int(cdb[2:4]) == 15
        assert scsi_ba_to_int(cdb[4:6]) == 32
        assert cdb[8] == 0x01
        cdb = m.unmarshall_cdb(cdb)
        assert cdb['opcode'] == s.device.opcodes.POSITION_TO_ELEMENT.value
        assert cdb['medium_transport_address'] == 15
        assert cdb['destination_address'] == 32
        assert cdb['invert'] == 1

        d = PositionToElement.unmarshall_cdb(
            PositionToElement.marshall_cdb(cdb))
        assert d == cdb
def main():
    with MockSCSI(MockDevice(smc)) as s:
        r = s.initializeelementstatuswithrange(15, 3, rng=1, fast=1)
        cdb = r.cdb
        assert cdb[0] == s.device.opcodes.INITIALIZE_ELEMENT_STATUS_WITH_RANGE.value
        assert cdb[1] == 0x03
        assert scsi_ba_to_int(cdb[2:4]) == 15
        assert scsi_ba_to_int(cdb[6:8]) == 3

        cdb = r.unmarshall_cdb(cdb)
        assert cdb['opcode'] == s.device.opcodes.INITIALIZE_ELEMENT_STATUS_WITH_RANGE.value
        assert cdb['starting_element_address'] == 15
        assert cdb['number_of_elements'] == 3
        assert cdb['fast'] == 1
        assert cdb['range'] == 1

        d = InitializeElementStatusWithRange.unmarshall_cdb(InitializeElementStatusWithRange.marshall_cdb(cdb))
        assert d == cdb
def main():
    with MockSCSI(MockDevice(sbc)) as s:
        r = s.getlbastatus(19938722, alloclen=1112527)
        cdb = r.cdb
        assert cdb[0] == s.device.opcodes.SBC_OPCODE_9E.value
        assert cdb[
            1] == s.device.opcodes.SBC_OPCODE_9E.serviceaction.GET_LBA_STATUS
        assert scsi_ba_to_int(cdb[2:10]) == 19938722
        assert scsi_ba_to_int(cdb[10:14]) == 1112527
        assert cdb[14:16] == bytearray(2)
        cdb = r.unmarshall_cdb(cdb)
        assert cdb['opcode'] == s.device.opcodes.SBC_OPCODE_9E.value
        assert cdb[
            'service_action'] == s.device.opcodes.SBC_OPCODE_9E.serviceaction.GET_LBA_STATUS
        assert cdb['lba'] == 19938722
        assert cdb['alloc_len'] == 1112527

        d = GetLBAStatus.unmarshall_cdb(GetLBAStatus.marshall_cdb(cdb))
        assert d == cdb
    def test_main(self):
        with MockSCSI(MockDevice(smc)) as s:
            # cdb for SMC: ElementAddressAssignment
            m = s.modesense10(page_code=MODESENSE10.PAGE_CODE.ELEMENT_ADDRESS_ASSIGNMENT)
            cdb = m.cdb
            self.assertEqual(cdb[0], s.device.opcodes.MODE_SENSE_10.value)
            self.assertEqual(cdb[1], 0)
            self.assertEqual(cdb[2], MODESENSE10.PAGE_CODE.ELEMENT_ADDRESS_ASSIGNMENT)
            self.assertEqual(cdb[3], 0)
            self.assertEqual(cdb[4:6], bytearray(2))
            self.assertEqual(scsi_ba_to_int(cdb[7:9]), 96)
            self.assertEqual(cdb[9], 0)
            cdb = m.unmarshall_cdb(cdb)
            self.assertEqual(cdb['opcode'], s.device.opcodes.MODE_SENSE_10.value)
            self.assertEqual(cdb['dbd'], 0)
            self.assertEqual(cdb['llbaa'], 0)
            self.assertEqual(cdb['page_code'], MODESENSE10.PAGE_CODE.ELEMENT_ADDRESS_ASSIGNMENT)
            self.assertEqual(cdb['pc'], 0)
            self.assertEqual(cdb['sub_page_code'], 0)
            self.assertEqual(cdb['alloc_len'], 96)

            d = ModeSense10.unmarshall_cdb(ModeSense10.marshall_cdb(cdb))
            self.assertEqual(d, cdb)

            m = s.modesense10(page_code=0, sub_page_code=3, llbaa=1, dbd=1, pc=MODESENSE10.PC.DEFAULT, alloclen=90)
            cdb = m.cdb
            self.assertEqual(cdb[0], s.device.opcodes.MODE_SENSE_10.value)
            self.assertEqual(cdb[1], 0x18)
            self.assertEqual(cdb[2], MODESENSE10.PC.DEFAULT << 6)
            self.assertEqual(cdb[3], 3)
            self.assertEqual(scsi_ba_to_int(cdb[7:9]), 90)
            cdb = m.unmarshall_cdb(cdb)
            self.assertEqual(cdb['opcode'], s.device.opcodes.MODE_SENSE_10.value)
            self.assertEqual(cdb['dbd'], 1)
            self.assertEqual(cdb['pc'], MODESENSE10.PC.DEFAULT)
            self.assertEqual(cdb['page_code'], 0)
            self.assertEqual(cdb['sub_page_code'], 3)
            self.assertEqual(cdb['alloc_len'], 90)
            self.assertEqual(cdb['llbaa'], 1)

            d = ModeSense10.unmarshall_cdb(ModeSense10.marshall_cdb(cdb))
            self.assertEqual(d, cdb)
def main():
    dev = MockGetLBAStatus()
    dev.opcodes = sbc
    s = SCSI(dev)

    r = s.getlbastatus(19938722, alloclen=1112527)
    cdb = r.cdb
    assert cdb[0] == s.device.opcodes.SBC_OPCODE_9E.value
    assert cdb[1] == s.device.opcodes.SBC_OPCODE_9E.serviceaction.GET_LBA_STATUS
    assert scsi_ba_to_int(cdb[2:10]) == 19938722
    assert scsi_ba_to_int(cdb[10:14]) == 1112527
    assert cdb[14:16] == bytearray(2)
    cdb = r.unmarshall_cdb(cdb)
    assert cdb['opcode'] == s.device.opcodes.SBC_OPCODE_9E.value
    assert cdb['service_action'] == s.device.opcodes.SBC_OPCODE_9E.serviceaction.GET_LBA_STATUS
    assert cdb['lba'] == 19938722
    assert cdb['alloc_len'] == 1112527

    d = GetLBAStatus.unmarshall_cdb(GetLBAStatus.marshall_cdb(cdb))
    assert d == cdb
Esempio n. 35
0
def main():
    with MockSCSI(MockDevice(smc)) as s:
        m = s.movemedium(15, 32, 64, invert=1)
        cdb = m.cdb
        assert cdb[0] == s.device.opcodes.MOVE_MEDIUM.value
        assert cdb[1] == 0
        assert scsi_ba_to_int(cdb[2:4]) == 15
        assert scsi_ba_to_int(cdb[4:6]) == 32
        assert scsi_ba_to_int(cdb[6:8]) == 64
        assert cdb[8] == 0
        assert cdb[9] == 0
        assert cdb[10] == 0x01
        cdb = m.unmarshall_cdb(cdb)
        assert cdb['opcode'] == s.device.opcodes.MOVE_MEDIUM.value
        assert cdb['medium_transport_address'] == 15
        assert cdb['source_address'] == 32
        assert cdb['destination_address'] == 64
        assert cdb['invert'] == 1

        d = MoveMedium.unmarshall_cdb(MoveMedium.marshall_cdb(cdb))
        assert d == cdb
Esempio n. 36
0
    def test_main(self):
        with MockSCSI(MockDevice(smc)) as s:
            m = s.movemedium(15, 32, 64, invert=1)
            cdb = m.cdb
            self.assertEqual(cdb[0], s.device.opcodes.MOVE_MEDIUM.value)
            self.assertEqual(cdb[1], 0)
            self.assertEqual(scsi_ba_to_int(cdb[2:4]), 15)
            self.assertEqual(scsi_ba_to_int(cdb[4:6]), 32)
            self.assertEqual(scsi_ba_to_int(cdb[6:8]), 64)
            self.assertEqual(cdb[8], 0)
            self.assertEqual(cdb[9], 0)
            self.assertEqual(cdb[10], 0x01)
            cdb = m.unmarshall_cdb(cdb)
            self.assertEqual(cdb['opcode'], s.device.opcodes.MOVE_MEDIUM.value)
            self.assertEqual(cdb['medium_transport_address'], 15)
            self.assertEqual(cdb['source_address'], 32)
            self.assertEqual(cdb['destination_address'], 64)
            self.assertEqual(cdb['invert'], 1)

            d = MoveMedium.unmarshall_cdb(MoveMedium.marshall_cdb(cdb))
            self.assertEqual(d, cdb)
 def unmarshall_datain(data):
     """
     Unmarshall the ReportPriority datain.
     """
     result = {}
     #  get the data after the ppd_len
     _data = data[4:scsi_ba_to_int(data[:4])]
     _descriptors = []
     while len(_data):
         _r = {}
         _dict = dict(ReportPriority._datain_bits.copy)
         _dict.update({
             'transport_id': [hex(scsi_ba_to_int(_data[6:7])), 8],
         })
         decode_bits(_data[:8 + scsi_ba_to_int(_data[6:7])], _dict, _r)
         _descriptors.append(_r)
         _data = _data[scsi_ba_to_int(_r['adlen']) + 8:]
     result.update({
         'priority_descriptors': _descriptors,
     })
     return result
    def unmarshall_datain(data):
        """
        Unmarshall the ModeSense10 datain.

        :param data: a byte array
        :return result: a dict
        """
        result = {}
        _mps = []
        decode_bits(data[0:8],
                    MODESENSE10.mode_parameter_header_bits,
                    result)

        _bdl = scsi_ba_to_int(data[6:8])
        block_descriptor = data[8:_bdl]  # no one really use this variable in here ?

        data = data[8 + _bdl:]

        _r = {}
        if not data[0] & 0x40:
            decode_bits(data,
                        MODESENSE10.page_zero_bits,
                        _r)
            data = data[2:]
        else:
            decode_bits(data,
                        MODESENSE10.sub_page_bits,
                        _r)
            data = data[4:]

        if _r['page_code'] == PAGE_CODE.ELEMENT_ADDRESS_ASSIGNMENT:
            decode_bits(data,
                        MODESENSE10.element_address_bits,
                        _r)
        if _r['page_code'] == PAGE_CODE.CONTROL:
            if not 'sub_page_code' in _r:
                decode_bits(data,
                            MODESENSE10.control_bits,
                            _r)
            elif _r['sub_page_code'] == 1:
                decode_bits(data,
                            MODESENSE10.control_extension_1_bits,
                            _r)
        if _r['page_code'] == PAGE_CODE.DISCONNECT_RECONNECT:
            if not 'sub_page_code' in _r:
                decode_bits(data,
                            MODESENSE10.disconnect_reconnect_bits,
                            _r)

        _mps.append(_r)

        result.update({'mode_pages': _mps})
        return result
def main():
    with MockSCSI(MockDevice(smc)) as s:
        r = s.initializeelementstatuswithrange(15, 3, rng=1, fast=1)
        cdb = r.cdb
        assert cdb[
            0] == s.device.opcodes.INITIALIZE_ELEMENT_STATUS_WITH_RANGE.value
        assert cdb[1] == 0x03
        assert scsi_ba_to_int(cdb[2:4]) == 15
        assert scsi_ba_to_int(cdb[6:8]) == 3

        cdb = r.unmarshall_cdb(cdb)
        assert cdb[
            'opcode'] == s.device.opcodes.INITIALIZE_ELEMENT_STATUS_WITH_RANGE.value
        assert cdb['starting_element_address'] == 15
        assert cdb['number_of_elements'] == 3
        assert cdb['fast'] == 1
        assert cdb['range'] == 1

        d = InitializeElementStatusWithRange.unmarshall_cdb(
            InitializeElementStatusWithRange.marshall_cdb(cdb))
        assert d == cdb
Esempio n. 40
0
def main():
    with MockSCSI(MockDevice(smc)) as s:
        m = s.movemedium(15, 32, 64, invert=1)
        cdb = m.cdb
        assert cdb[0] == s.device.opcodes.MOVE_MEDIUM.value
        assert cdb[1] == 0
        assert scsi_ba_to_int(cdb[2:4]) == 15
        assert scsi_ba_to_int(cdb[4:6]) == 32
        assert scsi_ba_to_int(cdb[6:8]) == 64
        assert cdb[8] == 0
        assert cdb[9] == 0
        assert cdb[10] == 0x01
        cdb = m.unmarshall_cdb(cdb)
        assert cdb['opcode'] == s.device.opcodes.MOVE_MEDIUM.value
        assert cdb['medium_transport_address'] == 15
        assert cdb['source_address'] == 32
        assert cdb['destination_address'] == 64
        assert cdb['invert'] == 1

        d = MoveMedium.unmarshall_cdb(MoveMedium.marshall_cdb(cdb))
        assert d == cdb
    def unmarshall_datain(cls, data):
        """
        Unmarshall the ModeSense10 datain.

        :param data: a byte array
        :return result: a dict
        """
        result = {}
        _mps = []
        decode_bits(data[0:8],
                    cls.MODESENSE10.mode_parameter_header_bits,
                    result)

        _bdl = scsi_ba_to_int(data[6:8])
        block_descriptor = data[8:_bdl]  # no one really use this variable in here ?

        data = data[8 + _bdl:]

        _r = {}
        if not data[0] & 0x40:
            decode_bits(data,
                        cls.MODESENSE10.page_zero_bits,
                        _r)
            data = data[2:]
        else:
            decode_bits(data,
                        cls.MODESENSE10.sub_page_bits,
                        _r)
            data = data[4:]

        if _r['page_code'] == cls.PAGE_CODE.ELEMENT_ADDRESS_ASSIGNMENT:
            decode_bits(data,
                        cls.MODESENSE10.element_address_bits,
                        _r)
        if _r['page_code'] == cls.PAGE_CODE.CONTROL:
            if 'sub_page_code' not in _r:
                decode_bits(data,
                            cls.MODESENSE10.control_bits,
                            _r)
            elif _r['sub_page_code'] == 1:
                decode_bits(data,
                            cls.MODESENSE10.control_extension_1_bits,
                            _r)
        if _r['page_code'] == cls.PAGE_CODE.DISCONNECT_RECONNECT:
            if 'sub_page_code' not in _r:
                decode_bits(data,
                            cls.MODESENSE10.disconnect_reconnect_bits,
                            _r)

        _mps.append(_r)

        result.update({'mode_pages': _mps})
        return result
    def test_main(self):
        with MockSCSI(MockDevice(smc)) as s:
            m = s.exchangemedium(15, 32, 64, 32, inv1=1)
            cdb = m.cdb
            self.assertEqual(cdb[0], s.device.opcodes.EXCHANGE_MEDIUM.value)
            self.assertEqual(cdb[1], 0)
            self.assertEqual(scsi_ba_to_int(cdb[2:4]), 15)
            self.assertEqual(scsi_ba_to_int(cdb[4:6]), 32)
            self.assertEqual(scsi_ba_to_int(cdb[6:8]), 64)
            self.assertEqual(scsi_ba_to_int(cdb[8:10]), 32)
            self.assertEqual(cdb[10], 0x02)
            cdb = m.unmarshall_cdb(cdb)
            self.assertEqual(cdb['opcode'], s.device.opcodes.EXCHANGE_MEDIUM.value)
            self.assertEqual(cdb['medium_transport_address'], 15)
            self.assertEqual(cdb['source_address'], 32)
            self.assertEqual(cdb['first_destination_address'], 64)
            self.assertEqual(cdb['second_destination_address'], 32)
            self.assertEqual(cdb['inv1'], 1)
            self.assertEqual(cdb['inv2'], 0)

            d = ExchangeMedium.unmarshall_cdb(ExchangeMedium.marshall_cdb(cdb))
            self.assertEqual(d, cdb)
def main():
    with MockSCSI(MockDevice(smc)) as s:
        m = s.opencloseimportexportelement(32, s.device.opcodes.OPEN_CLOSE_IMPORT_EXPORT_ELEMENT.serviceaction.CLOSE_IMPORTEXPORT_ELEMENT)
        cdb = m.cdb
        assert cdb[0] == s.device.opcodes.OPEN_CLOSE_IMPORT_EXPORT_ELEMENT.value
        assert scsi_ba_to_int(cdb[2:4]) == 32
        assert cdb[4] == 0x01
        cdb = m.unmarshall_cdb(cdb)
        assert cdb['opcode'] == s.device.opcodes.OPEN_CLOSE_IMPORT_EXPORT_ELEMENT.value
        assert cdb['element_address'] == 32
        assert cdb['action_code'] == s.device.opcodes.OPEN_CLOSE_IMPORT_EXPORT_ELEMENT.serviceaction.CLOSE_IMPORTEXPORT_ELEMENT

        d = OpenCloseImportExportElement.unmarshall_cdb(OpenCloseImportExportElement.marshall_cdb(cdb))
        assert d == cdb
Esempio n. 44
0
    def test_main(self):
        with MockSCSI(MockDevice(smc)) as s:
            r = s.initializeelementstatuswithrange(15, 3, rng=1, fast=1)
            cdb = r.cdb
            self.assertEqual(
                cdb[0],
                s.device.opcodes.INITIALIZE_ELEMENT_STATUS_WITH_RANGE.value)
            self.assertEqual(cdb[1], 0x03)
            self.assertEqual(scsi_ba_to_int(cdb[2:4]), 15)
            self.assertEqual(scsi_ba_to_int(cdb[6:8]), 3)

            cdb = r.unmarshall_cdb(cdb)
            self.assertEqual(
                cdb['opcode'],
                s.device.opcodes.INITIALIZE_ELEMENT_STATUS_WITH_RANGE.value)
            self.assertEqual(cdb['starting_element_address'], 15)
            self.assertEqual(cdb['number_of_elements'], 3)
            self.assertEqual(cdb['fast'], 1)
            self.assertEqual(cdb['range'], 1)

            d = InitializeElementStatusWithRange.unmarshall_cdb(
                InitializeElementStatusWithRange.marshall_cdb(cdb))
            self.assertEqual(d, cdb)
Esempio n. 45
0
    def unmarshall_datain(data):
        """
        Unmarshall the GetLBAStatus datain.
        """
        result = {}
        _data = data[8:scsi_ba_to_int(data[:4]) + 4]
        _lbas = []
        while len(_data):
            _r = {}
            decode_bits(_data[:16], GetLBAStatus._datain_bits, _r)
            _lbas.append(_r)
            _data = _data[16:]

        result.update({'lbas': _lbas})
        return result
def main():
    dev = MockInitializeElementStatusWithRange()
    dev.opcodes = smc
    s = SCSI(dev)
    # we need to reassign the right enum again because the MockDevice will return the wrong
    # peripheral_device_type and therefor assign the spc enum instead of smc.
    s.device.opcodes = smc

    r = s.initializeelementstatuswithrange(15, 3, rng=1, fast=1)
    cdb = r.cdb
    assert cdb[0] == s.device.opcodes.INITIALIZE_ELEMENT_STATUS_WITH_RANGE.value
    assert cdb[1] == 0x03
    assert scsi_ba_to_int(cdb[2:4]) == 15
    assert scsi_ba_to_int(cdb[6:8]) == 3

    cdb = r.unmarshall_cdb(cdb)
    assert cdb['opcode'] == s.device.opcodes.INITIALIZE_ELEMENT_STATUS_WITH_RANGE.value
    assert cdb['starting_element_address'] == 15
    assert cdb['number_of_elements'] == 3
    assert cdb['fast'] == 1
    assert cdb['range'] == 1

    d = InitializeElementStatusWithRange.unmarshall_cdb(InitializeElementStatusWithRange.marshall_cdb(cdb))
    assert d == cdb
Esempio n. 47
0
    def unmarshall_datain(data):
        """
        Unmarshall the ReadCapacity16 datain.
        """
        result = {}
        _data = data[8:scsi_ba_to_int(data[:4]) + 4]
        _lbas = []
        while len(_data):
            _r = {}
            decode_bits(_data[:16], GetLBAStatus._datain_bits, _r)
            _lbas.append(_r)
            _data = _data[16:]

        result.update({'lbas': _lbas})
        return result
def main():

    with MockSCSI(MockDevice(sbc)) as s:
        r = s.readcapacity16(alloclen=37)
        cdb = r.cdb
        assert cdb[0] == s.device.opcodes.SBC_OPCODE_9E.value
        assert cdb[1] == s.device.opcodes.SBC_OPCODE_9E.serviceaction.READ_CAPACITY_16
        assert cdb[2:10] == bytearray(8)
        assert scsi_ba_to_int(cdb[10:14]) == 37
        assert cdb[14:16] == bytearray(2)
        cdb = r.unmarshall_cdb(cdb)
        assert cdb['opcode'] == s.device.opcodes.SBC_OPCODE_9E.value
        assert cdb['service_action'] == s.device.opcodes.SBC_OPCODE_9E.serviceaction.READ_CAPACITY_16
        assert cdb['alloc_len'] == 37

        d = ReadCapacity16.unmarshall_cdb(ReadCapacity16.marshall_cdb(cdb))
        assert d == cdb
def main():

    with MockSCSI(MockDevice(spc)) as s:
        r = s.reportpriority(priority=0x00, alloclen=1112527)
        cdb = r.cdb
        assert cdb[0] == s.device.opcodes.SPC_OPCODE_A3.value
        assert cdb[1] == s.device.opcodes.SPC_OPCODE_A3.serviceaction.REPORT_PRIORITY
        assert cdb[2] == 0
        assert scsi_ba_to_int(cdb[6:10]) == 1112527
        assert cdb[10:12] == bytearray(2)
        cdb = r.unmarshall_cdb(cdb)
        assert cdb['opcode'] == s.device.opcodes.SPC_OPCODE_A3.value
        assert cdb['service_action'] == s.device.opcodes.SPC_OPCODE_A3.serviceaction.REPORT_PRIORITY
        assert cdb['priority_reported'] == 0
        assert cdb['alloc_len'] == 1112527

        d = ReportPriority.unmarshall_cdb(ReportPriority.marshall_cdb(cdb))
        assert d == cdb
    def marshall_datain(data):
        """
        Marshall the ReportPriority datain.
        """
        result = bytearray(4)
        if not 'priority_descriptors' in data:
            result[:4] = scsi_int_to_ba(len(result), 4)
            return result

        for l in data['priority_descriptors']:
            _r = bytearray(len(l))
            _dict = dict(ReportPriority._datain_bits.copy)
            _dict.update({'transport_id': [hex(scsi_ba_to_int(len(l) - 8)), 8], })
            encode_dict(l, _dict, _r)
            result += _r

        result[:4] = scsi_int_to_ba(len(result), 4)
        return result
    def unmarshall_datain(data):
        """
        Unmarshall the GetLBAStatus datain.

        :param data: a byte array
        :return result: a dict
        """
        result = {}
        _data = data[8:scsi_ba_to_int(data[:4]) + 4]
        _lbas = []
        while len(_data):
            _r = {}
            decode_bits(_data[:16],
                        GetLBAStatus._datain_bits,
                        _r)

            _lbas.append(_r)
            _data = _data[16:]

        result.update({'lbas': _lbas})
        return result
Esempio n. 52
0
def main():
    dev = MockWriteSame10()
    dev.opcodes = sbc
    s = SCSI(dev)

    data = bytearray(512)

    w = s.writesame10(1024, 27, data)
    cdb = w.cdb
    assert cdb[0] == s.device.opcodes.WRITE_SAME_10.value
    assert cdb[1] == 0
    assert scsi_ba_to_int(cdb[2:6]) == 1024
    assert cdb[6] == 0
    assert scsi_ba_to_int(cdb[7:9]) == 27
    assert cdb[9] == 0
    cdb = w.unmarshall_cdb(cdb)
    assert cdb['opcode'] == s.device.opcodes.WRITE_SAME_10.value
    assert cdb['wrprotect'] == 0
    assert cdb['anchor'] == 0
    assert cdb['unmap'] == 0
    assert cdb['lba'] == 1024
    assert cdb['group'] == 0
    assert cdb['nb'] == 27

    d = WriteSame10.unmarshall_cdb(WriteSame10.marshall_cdb(cdb))
    assert d == cdb

    w = s.writesame10(65536, 27, data, wrprotect=4, anchor=1, group=19)
    cdb = w.cdb
    assert cdb[0] == s.device.opcodes.WRITE_SAME_10.value
    assert cdb[1] == 0x90
    assert scsi_ba_to_int(cdb[2:6]) == 65536
    assert cdb[6] == 0x13
    assert scsi_ba_to_int(cdb[7:9]) == 27
    assert cdb[9] == 0
    cdb = w.unmarshall_cdb(cdb)
    assert cdb['opcode'] == s.device.opcodes.WRITE_SAME_10.value
    assert cdb['wrprotect'] == 4
    assert cdb['anchor'] == 1
    assert cdb['unmap'] == 0
    assert cdb['lba'] == 65536
    assert cdb['group'] == 19
    assert cdb['nb'] == 27

    d = WriteSame10.unmarshall_cdb(WriteSame10.marshall_cdb(cdb))
    assert d == cdb

    w = s.writesame10(65536, 27, data, wrprotect=4, unmap=1)
    cdb = w.cdb
    assert cdb[0] == s.device.opcodes.WRITE_SAME_10.value
    assert cdb[1] == 0x88
    assert scsi_ba_to_int(cdb[2:6]) == 65536
    assert cdb[6] == 0
    assert scsi_ba_to_int(cdb[7:9]) == 27
    assert cdb[9] == 0
    cdb = w.unmarshall_cdb(cdb)
    assert cdb['opcode'] == s.device.opcodes.WRITE_SAME_10.value
    assert cdb['wrprotect'] == 4
    assert cdb['anchor'] == 0
    assert cdb['unmap'] == 1
    assert cdb['lba'] == 65536
    assert cdb['group'] == 0
    assert cdb['nb'] == 27

    d = WriteSame10.unmarshall_cdb(WriteSame10.marshall_cdb(cdb))
    assert d == cdb
Esempio n. 53
0
    def unmarshall_designator(cls,
                              _type,
                              data):
        """
        static helper method to unmarshall designator data

        :param _type: type of the designator
        :param data: a byte array with designator data
        :return: a dict
        """
        _d = {}
        if _type == cls.DESIGNATOR.VENDOR_SPECIFIC:
            _d['vendor_specific'] = data

        if _type == cls.DESIGNATOR.T10_VENDOR_ID:
            _d['t10_vendor_id'] = data[:8]
            _d['vendor_specific_id'] = data[8:]

        if _type == cls.DESIGNATOR.EUI_64:
            if len(data) == 8:
                _d['ieee_company_id'] = convert.scsi_ba_to_int(data[:3])
                _d['vendor_specific_extension_id'] = data[3:8]
            if len(data) == 12:
                _d['ieee_company_id'] = convert.scsi_ba_to_int(data[:3])
                _d['vendor_specific_extension_id'] = data[3:8]
                _d['directory_id'] = data[8:]
            if len(data) == 16:
                _d['identifier_extension'] = data[:8]
                _d['ieee_company_id'] = convert.scsi_ba_to_int(data[8:11])
                _d['vendor_specific_extension_id'] = data[11:]

        if _type == cls.DESIGNATOR.NAA:
            convert.decode_bits(data,
                                cls._naa_type_bits,
                                _d)
            if _d['naa'] == cls.NAA.IEEE_EXTENDED:
                convert.decode_bits(data,
                                    cls._naa_ieee_extended_bits,
                                    _d)
            if _d['naa'] == cls.NAA.LOCALLY_ASSIGNED:
                convert.decode_bits(data,
                                    cls._naa_locally_assigned_bits,
                                    _d)
            if _d['naa'] == cls.NAA.IEEE_REGISTERED:
                convert.decode_bits(data,
                                    cls._naa_ieee_registered_bits,
                                    _d)
            if _d['naa'] == cls.NAA.IEEE_REGISTERED_EXTENDED:
                convert.decode_bits(data,
                                    cls._naa_ieee_registered_extended_bits,
                                    _d)

        if _type == cls.DESIGNATOR.RELATIVE_TARGET_PORT_IDENTIFIER:
            convert.decode_bits(data,
                                cls._relative_port_bits,
                                _d)

        if _type == cls.DESIGNATOR.TARGET_PORTAL_GROUP:
            convert.decode_bits(data,
                                cls._target_portal_group_bits,
                                _d)

        if _type == cls.DESIGNATOR.LOGICAL_UNIT_GROUP:
            convert.decode_bits(data,
                                cls._logical_unit_group_bits,
                                _d)

        if _type == cls.DESIGNATOR.MD5_LOGICAL_IDENTIFIER:
            _d['md5_logical_identifier'] = data[0:16]

        if _type == cls.DESIGNATOR.SCSI_NAME_STRING:
            _d['scsi_name_string'] = data

        if _type == cls.DESIGNATOR.PCI_EXPRESS_ROUTING_ID:
            convert.decode_bits(data,
                                cls._pci_express_routing_id_bits,
                                _d)
        return _d
Esempio n. 54
0
    def unmarshall_datain(data, evpd=0):
        """
        Unmarshall the Inquiry datain
        """
        result = {}
        decode_bits(data, Inquiry._datain_bits, result)

        if evpd == 0:
            decode_bits(data, Inquiry._standard_bits, result)
            result.update({'t10_vendor_identification': data[8:16]})
            result.update({'product_identification': data[16:32]})
            result.update({'product_revision_level': data[32:36]})
            return result

        decode_bits(data, Inquiry._pagecode_bits, result)
        data = data[:4 + scsi_ba_to_int(data[2:4])]

        if result['page_code'] == inquiry_enums.VPD.SUPPORTED_VPD_PAGES:
            vpd_pages = []
            for i in data[4:]:
                vpd_pages.append(i)
            result.update({'vpd_pages': vpd_pages})
            return result

        if result['page_code'] == inquiry_enums.VPD.BLOCK_LIMITS:
            decode_bits(data, Inquiry._block_limits_bits, result)
            return result

        if result['page_code'] == inquiry_enums.VPD.BLOCK_DEVICE_CHARACTERISTICS:
            decode_bits(data, Inquiry._block_dev_char_bits, result)
            return result

        if result['page_code'] == inquiry_enums.VPD.LOGICAL_BLOCK_PROVISIONING:
            decode_bits(data, Inquiry._logical_block_provisioning_bits, result)
            return result

        if result['page_code'] == inquiry_enums.VPD.REFERRALS:
            decode_bits(data, Inquiry._referrals_bits, result)
            return result

        if result['page_code'] == inquiry_enums.VPD.UNIT_SERIAL_NUMBER:
            result.update({'unit_serial_number': data[4:]})
            return result

        if result['page_code'] == inquiry_enums.VPD.EXTENDED_INQUIRY_DATA:
            decode_bits(data, Inquiry._extended_bits, result)
            return result

        if result['page_code'] == inquiry_enums.VPD.DEVICE_IDENTIFICATION:
            data = data[4:]
            _d = []
            while len(data):
                _bc = data[3] + 4

                _dd = {}
                decode_bits(data, Inquiry._designator_bits, _dd)
                if _dd['piv'] == 0 or (_dd['association'] != 1 and _dd['association'] != 2):
                    del _dd['protocol_identifier']
                _dd['designator'] = Inquiry.unmarshall_designator(_dd['designator_type'], data[4:4 + data[3]])

                _d.append(_dd)
                data = data[_bc:]

            result.update({'designator_descriptors': _d})
            return result
Esempio n. 55
0
    def unmarshall_datain(cls, data, evpd=0):
        """
        Unmarshall the Inquiry datain buffer

        :param data: a byte array with inquiry data
        :param evpd: evpd can be 0 or 1
        :return result: a dict
        """
        result = {}
        convert.decode_bits(data,
                            cls._datain_bits,
                            result)

        if evpd == 0:

            convert.decode_bits(data,
                                cls._standard_bits,
                                result)
            return result

        convert.decode_bits(data,
                            cls._pagecode_bits,
                            result)
        data = data[:4 + convert.scsi_ba_to_int(data[2:4])]
        if result['page_code'] == cls.VPD.SUPPORTED_VPD_PAGES:
            vpd_pages = []
            for i in data[4:]:
                vpd_pages.append(i)
            result.update({'vpd_pages': vpd_pages})
            return result

        if result['page_code'] == cls.VPD.BLOCK_LIMITS:
            convert.decode_bits(data,
                                cls._block_limits_bits,
                                result)
            return result

        if result['page_code'] == cls.VPD.BLOCK_DEVICE_CHARACTERISTICS:
            convert.decode_bits(data,
                                cls._block_dev_char_bits,
                                result)
            return result

        if result['page_code'] == cls.VPD.LOGICAL_BLOCK_PROVISIONING:
            convert.decode_bits(data,
                                cls._logical_block_provisioning_bits,
                                result)
            return result

        if result['page_code'] == cls.VPD.REFERRALS:
            convert.decode_bits(data,
                                cls._referrals_bits,
                                result)
            return result

        if result['page_code'] == cls.VPD.UNIT_SERIAL_NUMBER:
            result.update({'unit_serial_number': data[4:]})
            return result

        if result['page_code'] == cls.VPD.EXTENDED_INQUIRY_DATA:
            convert.decode_bits(data,
                                cls._extended_bits,
                                result)
            return result

        if result['page_code'] == cls.VPD.ATA_INFORMATION:
            result.update(cls.unmarshall_ata_information(data))
            return result

        if result['page_code'] == cls.VPD.DEVICE_IDENTIFICATION:
            data = data[4:]
            _d = []
            while len(data):
                _bc = data[3] + 4

                _dd = {}
                convert.decode_bits(data,
                                    cls._designator_bits,
                                    _dd)
                if _dd['piv'] == 0 or (_dd['association'] != 1 and _dd['association'] != 2):
                    del _dd['protocol_identifier']
                _dd['designator'] = cls.unmarshall_designator(_dd['designator_type'],
                                                              data[4:4 + data[3]])
                _d.append(_dd)
                data = data[_bc:]

            result.update({'designator_descriptors': _d})
            return result
def main():
    dev = MockWriteSame16()
    dev.opcodes = sbc
    s = SCSI(dev)
    s.blocksize = 512
    data = bytearray(512)

    w = s.writesame16(1024, 27, data)
    cdb = w.cdb
    assert cdb[0] == s.device.opcodes.WRITE_SAME_16.value
    assert cdb[1] == 0
    assert scsi_ba_to_int(cdb[2:10]) == 1024
    assert scsi_ba_to_int(cdb[10:14]) == 27
    assert cdb[14] == 0
    assert cdb[15] == 0
    cdb = w.unmarshall_cdb(cdb)
    assert cdb['opcode'] == s.device.opcodes.WRITE_SAME_16.value
    assert cdb['wrprotect'] == 0
    assert cdb['anchor'] == 0
    assert cdb['unmap'] == 0
    assert cdb['ndob'] == 0
    assert cdb['lba'] == 1024
    assert cdb['group'] == 0
    assert cdb['nb'] == 27

    d = WriteSame16.unmarshall_cdb(WriteSame16.marshall_cdb(cdb))
    assert d == cdb

    w = s.writesame16(65536, 27, data, wrprotect=4, anchor=1, group=19)
    cdb = w.cdb
    assert cdb[0] == s.device.opcodes.WRITE_SAME_16.value
    assert cdb[1] == 0x90
    assert scsi_ba_to_int(cdb[2:10]) == 65536
    assert scsi_ba_to_int(cdb[10:14]) == 27
    assert cdb[14] == 0x13
    assert cdb[15] == 0
    cdb = w.unmarshall_cdb(cdb)
    assert cdb['opcode'] == s.device.opcodes.WRITE_SAME_16.value
    assert cdb['wrprotect'] == 4
    assert cdb['anchor'] == 1
    assert cdb['unmap'] == 0
    assert cdb['ndob'] == 0
    assert cdb['lba'] == 65536
    assert cdb['group'] == 19
    assert cdb['nb'] == 27

    d = WriteSame16.unmarshall_cdb(WriteSame16.marshall_cdb(cdb))
    assert d == cdb

    w = s.writesame16(65536, 27, data, wrprotect=4, unmap=1, ndob=1)
    cdb = w.cdb
    assert cdb[0] == s.device.opcodes.WRITE_SAME_16.value
    assert cdb[1] == 0x89
    assert scsi_ba_to_int(cdb[2:10]) == 65536
    assert scsi_ba_to_int(cdb[10:14]) == 27
    assert cdb[14] == 0
    assert cdb[15] == 0
    cdb = w.unmarshall_cdb(cdb)
    assert cdb['opcode'] == s.device.opcodes.WRITE_SAME_16.value
    assert cdb['wrprotect'] == 4
    assert cdb['anchor'] == 0
    assert cdb['unmap'] == 1
    assert cdb['ndob'] == 1
    assert cdb['lba'] == 65536
    assert cdb['group'] == 0
    assert cdb['nb'] == 27

    d = WriteSame16.unmarshall_cdb(WriteSame16.marshall_cdb(cdb))
    assert d == cdb