/// <summary>
        /// Format Sensor Data Records
        /// </summary>
        internal void GetSdrMetaData(short id, decimal version, byte recordType, SdrRecord record, ref SdrCollection sdrMessages)
        {
            SdrRecordType sdrRecordType;
            int sensorType = (int)recordType;
            // convert message type to to enum or return unspecified
            if (Enum.IsDefined(typeof(SdrRecordType), sensorType))
            {
                sdrRecordType = (SdrRecordType)sensorType;
            }
            else
            {
                sdrRecordType = SdrRecordType.Unspecified;
            }

            switch (sdrRecordType)
            {
                case SdrRecordType.Full: // Full Sensor
                    {
                        #region full Record
                        if (record.RecordData != null)
                        {
                            // Create sensor data record.
                            FullSensorRecord str;

                            // IPMI Spec [Table  43-1] Byte 24 Linearization
                            // [7] -  reserved
                            // [6:0] -  enum (linear, ln, log10, log2, e, exp10, exp2, 1/x, sqr(x), cube(x), sqrt(x),
                            //                cube-1 (x) )
                            //                70h = non-linear. 71h-7Fh = non-linear, OEM defined.
                            byte linearByte = (byte)(record.RecordData[23] & 0x7F);

                            if (linearByte > 0x0B && linearByte <= 0x7F)
                            {
                                // get current sensor reading using get sensor reading ipmi command
                                SensorReadingResponse reading = (SensorReadingResponse)this.IpmiSendReceive(
                                new SensorReadingRequest(record.RecordData[7]), typeof(SensorReadingResponse));

                                if (reading.CompletionCode == 0)
                                {
                                    // non linear sensors require the get sensor reading factores command to retrieve reading
                                    // factors.  ReadingFactorsRequest(Sensornumber, SensorReading)
                                    ReadingFactorsResponse factors = (ReadingFactorsResponse)this.IpmiSendReceive(
                                    new ReadingFactorsRequest(record.RecordData[7], reading.SensorReading), typeof(ReadingFactorsResponse));

                                    // Initialize the sdr message class with reading & factors
                                    str = new FullSensorRecord(id,
                                                            version,
                                                            sdrRecordType,
                                                            record,
                                                            factors.Factors,
                                                            factors.CompletionCode
                                                            );
                                }
                                else
                                {
                                    // Initialize the sdr message class with reading & factors
                                    str = new FullSensorRecord(id,
                                                            version,
                                                            sdrRecordType,
                                                            record,
                                                            new byte[6], // initialize with blank conversation factors.
                                                            reading.CompletionCode
                                                            );
                                }
                            }
                            else
                            {
                                // Initialize the sdr message class
                                str = new FullSensorRecord(id,
                                                        version,
                                                        sdrRecordType,
                                                        record,
                                                        record.completionCode
                                                        );
                            }

                            // append message to collection
                            sdrMessages.Add(str);
                        }
                        #endregion
                    }
                    break;
                case SdrRecordType.Compact: // Compact Sensor
                    {
                        #region Compact Sensor

                        // Initialize the sdr message class
                        CompactSensorRecord sdr = new CompactSensorRecord(id,
                                                                    version,
                                                                    sdrRecordType,
                                                                    record
                                                                    );
                        sdrMessages.Add(sdr);

                        #endregion
                    }
                    break;
                case SdrRecordType.EventOnly: // Event-Only
                    {
                        #region Event Only

                        SdrEventOnlyRecord sdr = new SdrEventOnlyRecord(id,
                                                                        version,
                                                                        sdrRecordType,
                                                                        record
                                                                        );
                        sdrMessages.Add(sdr);

                        #endregion
                    }
                    break;
                case SdrRecordType.Association: // Entity Association
                case SdrRecordType.DeviceRelative: // Device-relative Entity
                case SdrRecordType.GenericDevice: // Generic Device Locator
                case SdrRecordType.FRUDevice: // FRU Device Locator
                case SdrRecordType.ManagementDevice: // Management Controller Device
                case SdrRecordType.ManagementController: // Management Controller Confirmation
                case SdrRecordType.BmcMessageChannel: // BMC Message Channel Info
                case SdrRecordType.Oem: // OEM Record
                default:   // 0x0A = 0x0F reserved
                    break;
            }
        }
        /// <summary>
        ///  Get Sensor Data Repository Information Incrementally. Returns SDR Info.
        /// </summary>
        public virtual SdrCollection GetSdrIncrement()
        {
            // Default Record Off Set
            int offSet = 0;

            // Number of Bytes to Read. 0xFF for entire record.
            int bytesToRead = 0;

            // SDR RecordId (0000h for entry point)
            ushort recordId = 0;

            // Last SDR RecordId (aborts event log Loop)
            ushort lastRecordId = 65535;

            // security mech to step out of loop.
            int pass = 0;

            // create sdr record collection for raw SDR records.
            IpmiSdrCollection records = new IpmiSdrCollection();

            // reserve the SDR for partial reads
            ReserveSdrResponse reserve = (ReserveSdrResponse)this.IpmiSendReceive(
            new ReserveSdrRequest(), typeof(ReserveSdrResponse));

            if (reserve.CompletionCode == 0)
            {

                // reserved LS byte
                byte reserveLs = reserve.ReservationLS;

                // reserved MS byte
                byte reserveMs = reserve.ReservationMS;

                // lenght of the SDR record
                int recordLenght = 0;

                // sdr record index
                int index = 0;

                // retrieve all records while connected by recursively calling the SDR entry command
                while (recordId != lastRecordId || pass > 1000)
                {
                    // create SDR record
                    SdrRecord sdr = new SdrRecord();
                    {
                        // initialize offset to zero for new record
                        offSet = 0;

                        // initialize to the minimum read size of 5 bytes. (extended to 14 on incremental read)
                        bytesToRead = 5;

                        // get the SEL record
                        GetSdrPartialResponse response = (GetSdrPartialResponse)this.IpmiSendReceive(
                        new GetSdrPartialRequest(reserveLs, reserveMs, recordId, offSet, bytesToRead), typeof(GetSdrPartialResponse));

                        // set the sdr completion code.
                        sdr.completionCode = response.CompletionCode;

                        if (response.CompletionCode == 0)
                        {
                            // set record id
                            sdr.RecordId = new byte[2] { response.RecordData[1], response.RecordData[0] };

                            // set the record version
                            sdr.RecordVersion = response.RecordData[2];

                            // set record type
                            sdr.RecordType = response.RecordData[3];

                            // set record lenght
                            sdr.RecordLenght = response.RecordData[4];

                            // convert record lenght to int & add the initial 5 bytes.
                            recordLenght = (Convert.ToInt32(response.RecordData[4])) + 5;

                            // create SDR byte array to hold record data.
                            byte[] sdrDataRecord = new byte[recordLenght];

                            // initilize sdr array index to zero
                            index = 0;

                            // copy SDR data to the sdr data record array and increase the index
                            Buffer.BlockCopy(response.RecordData, 0, sdrDataRecord, index, bytesToRead);
                            index += bytesToRead;

                            // increase the offset by bytes already read
                            offSet += bytesToRead;

                            int offsetPass = 0;

                            // recursively get partial sdr record until the offset reaches the recordlenght
                            while (offSet < recordLenght || offsetPass > 100)
                            {
                                // get maximum read chunk (14 bytes or less).
                                bytesToRead = (recordLenght - offSet);
                                // the size to 14 byte increments
                                bytesToRead = (bytesToRead > 14) ? 14 : bytesToRead;

                                // get partial SDR record
                                GetSdrPartialResponse partialResponse = (GetSdrPartialResponse)this.IpmiSendReceive(
                                new GetSdrPartialRequest(reserve.ReservationLS, reserve.ReservationMS, recordId, offSet, bytesToRead), typeof(GetSdrPartialResponse));

                                if (partialResponse.CompletionCode == 0)
                                {
                                    // copy SDR data to the sdr data array and increase the index size by bytes read.
                                    Buffer.BlockCopy(partialResponse.RecordData, 0, sdrDataRecord, index, bytesToRead);
                                    index += bytesToRead;

                                    // increase the offset by the bytes read
                                    offSet += bytesToRead;
                                }
                                else
                                {
                                    // set the sdr completion code.
                                    sdr.completionCode = partialResponse.CompletionCode;
                                    break;
                                }

                                offsetPass++;
                            }

                            // set the record data to the fully populdated sdrDataRecord array
                            sdr.RecordData = sdrDataRecord;

                            // update the record Id (signals loop exit)
                            recordId = BitConverter.ToUInt16(new byte[2] { response.RecordIdMsByte, response.RecordIdLsByte }, 0);
                        }
                        else
                        {
                            break;
                        }
                    }

                    pass++;

                    // add the record to the collection
                    records.Add(sdr);
                }
            }

            // return collection
            SdrCollection sdrMessages = new SdrCollection();
            sdrMessages.completionCode = reserve.CompletionCode;

            if (reserve.CompletionCode != 0)
                sdrMessages.command = typeof(ReserveSdrResponse).ToString();

            // check response collection holds values
            if (records.Count > 0)
            {
                // sdr version array
                byte[] verarr = new byte[2];

                // record id
                short id;

                foreach (SdrRecord record in records)
                {
                    if (record.completionCode == 0)
                    {
                        // record Id
                        id = BitConverter.ToInt16(record.RecordId, 0);

                        // populdate version array
                        Buffer.BlockCopy(IpmiSharedFunc.ByteSplit(record.RecordVersion, new int[2] { 4, 0 }), 0, verarr, 0, 2);

                        string sVersion = Convert.ToUInt16(verarr[1]).ToString(CultureInfo.InvariantCulture) + "." + Convert.ToInt16(verarr[0]).ToString(CultureInfo.InvariantCulture);

                        // set version
                        Decimal version = 0;
                        // sdr record version number
                        if (!decimal.TryParse(sVersion, out version)) { version = 0; }

                        GetSdrMetaData(id, version, record.RecordType, record, ref sdrMessages);
                    }
                    else
                    {
                        sdrMessages.command += " : " + sdrMessages.completionCode + ". RecordId:" + record.RecordId.ToString();
                        sdrMessages.completionCode = record.completionCode;
                    }
                }
            }

            return sdrMessages;
        }
        /// <summary>
        ///  Get Sensor Data Repository. Returns SDR Info.
        /// </summary>
        public virtual SdrCollection GetSdr()
        {
            // Default Record Off Set
            int offSet = 0;

            // Number of Bytes to Read. 0xFF for entire record.
            byte bytesToRead = 0xFF;

            // SDR RecordId (0000h for entry point)
            ushort recordId = 0;

            // Last SDR RecordId (aborts event log Loop)
            ushort lastRecordId = 65535;

            // security mech to step out of loop.
            int pass = 0;

            // create sdr record collection for raw SDR records.
            IpmiSdrCollection records = new IpmiSdrCollection();

            // reserve the SDR for partial reads
            ReserveSdrResponse reserve = (ReserveSdrResponse)this.IpmiSendReceive(
            new ReserveSdrRequest(), typeof(ReserveSdrResponse));

            if (reserve.CompletionCode == 0)
            {

                // reserved LS byte
                byte reserveLs = reserve.ReservationLS;

                // reserved MS byte
                byte reserveMs = reserve.ReservationMS;

                // retrieve all records while connected by recursively calling the SDR entry command
                while (recordId != lastRecordId || pass > 1000)
                {
                    // create SDR record
                    SdrRecord sdr = new SdrRecord();
                    {
                        // get the SEL record
                        GetSdrPartialResponse response = (GetSdrPartialResponse)this.IpmiSendReceive(
                        new GetSdrPartialRequest(reserveLs, reserveMs, recordId, offSet, bytesToRead), typeof(GetSdrPartialResponse));

                        if (response.CompletionCode == 0)
                        {
                            sdr.completionCode = response.CompletionCode;

                            // set record id
                            sdr.RecordId = new byte[2] { response.RecordData[1], response.RecordData[0] };

                            // set the record version
                            sdr.RecordVersion = response.RecordData[2];

                            // set record type
                            sdr.RecordType = response.RecordData[3];

                            // set record length
                            sdr.RecordLenght = response.RecordData[4];

                            // set the record data to record data
                            sdr.RecordData = response.RecordData;

                            // update the record Id (signals loop exit)
                            recordId = BitConverter.ToUInt16(new byte[2] { response.RecordIdMsByte, response.RecordIdLsByte }, 0);
                        }
                        else
                        {
                            sdr.completionCode = response.CompletionCode;
                            break;
                        }
                    }

                    pass++;

                    // add the record to the collection
                    records.Add(sdr);
                }
            }

            // return collection
            SdrCollection sdrMessages = new SdrCollection();

            // check response collection holds values
            if (records.Count > 0)
            {
                // sdr version array
                byte[] verarr = new byte[2];

                // record id
                short id;

                foreach (SdrRecord record in records)
                {
                    if (record.completionCode == 0)
                    {
                        // set the sdr collection completion code to indicate a failure occurred
                        sdrMessages.completionCode = record.completionCode;

                        // record Id
                        id = BitConverter.ToInt16(record.RecordId, 0);

                        // populdate version array
                        Buffer.BlockCopy(IpmiSharedFunc.ByteSplit(record.RecordVersion, new int[2] { 4, 0 }), 0, verarr, 0, 2);

                        string sVersion = Convert.ToUInt16(verarr[1]).ToString(CultureInfo.InvariantCulture) + "." + Convert.ToInt16(verarr[0]).ToString(CultureInfo.InvariantCulture);

                        // set version
                        Decimal version = 0;
                        // sdr record version number
                        if (!decimal.TryParse(sVersion, out version)) { version = 0; }

                        GetSdrMetaData(id, version, record.RecordType, record, ref sdrMessages);

                    }
                    // set the sdr completion code to indicate a failure occurred
                    sdrMessages.completionCode = record.completionCode;
                }
            }

            return sdrMessages;
        }
Пример #4
0
        /// <summary>
        /// Format Sensor Data Records
        /// </summary>
        internal void GetSdrMetatData(short id, decimal version, byte recordType, SdrRecord record, ref SdrCollection sdrMessages)
        {
            SdrRecordType sdrRecordType;
            int           sensorType = (int)recordType;

            // convert message type to to enum or return unspecified
            if (Enum.IsDefined(typeof(SdrRecordType), sensorType))
            {
                sdrRecordType = (SdrRecordType)sensorType;
            }
            else
            {
                sdrRecordType = SdrRecordType.Unspecified;
            }

            switch (sdrRecordType)
            {
            case SdrRecordType.Full:     // Full Sensor
            {
                #region full Record
                if (record.RecordData != null)
                {
                    // Create sensor data record.
                    FullSensorRecord str;

                    // IPMI Spec [Table  43-1] Byte 24 Linearization
                    // [7] -  reserved
                    // [6:0] -  enum (linear, ln, log10, log2, e, exp10, exp2, 1/x, sqr(x), cube(x), sqrt(x),
                    //                cube-1 (x) )
                    //                70h = non-linear. 71h-7Fh = non-linear, OEM defined.
                    byte linearByte = (byte)(record.RecordData[23] & 0x7F);

                    if (linearByte > 0x0B && linearByte <= 0x7F)
                    {
                        // get current sensor reading using get sensor reading ipmi command
                        SensorReadingResponse reading = (SensorReadingResponse)this.IpmiSendReceive(
                            new SensorReadingRequest(record.RecordData[7]), typeof(SensorReadingResponse));

                        if (reading.CompletionCode == 0)
                        {
                            // non linear sensors require the get sensor reading factores command to retrieve reading
                            // factors.  ReadingFactorsRequest(Sensornumber, SensorReading)
                            ReadingFactorsResponse factors = (ReadingFactorsResponse)this.IpmiSendReceive(
                                new ReadingFactorsRequest(record.RecordData[7], reading.SensorReading), typeof(ReadingFactorsResponse));

                            // Initialize the sdr message class with reading & factors
                            str = new FullSensorRecord(id,
                                                       version,
                                                       sdrRecordType,
                                                       record,
                                                       factors.Factors,
                                                       factors.CompletionCode
                                                       );
                        }
                        else
                        {
                            // Initialize the sdr message class with reading & factors
                            str = new FullSensorRecord(id,
                                                       version,
                                                       sdrRecordType,
                                                       record,
                                                       new byte[6],      // initialize with blank conversation factors.
                                                       reading.CompletionCode
                                                       );
                        }
                    }
                    else
                    {
                        // Initialize the sdr message class
                        str = new FullSensorRecord(id,
                                                   version,
                                                   sdrRecordType,
                                                   record,
                                                   record.completionCode
                                                   );
                    }

                    // append message to collection
                    sdrMessages.Add(str);
                }
                #endregion
            }
            break;

            case SdrRecordType.Compact:     // Compact Sensor
            {
                #region Compact Sensor

                // Initialize the sdr message class
                CompactSensorRecord sdr = new CompactSensorRecord(id,
                                                                  version,
                                                                  sdrRecordType,
                                                                  record
                                                                  );
                //SdrRecordCompact(ref str, record);
                sdrMessages.Add(sdr);

                #endregion
            }
            break;

            case SdrRecordType.EventOnly:     // Event-Only
            {
                #region Event Only

                SdrEventOnlyRecord sdr = new SdrEventOnlyRecord(id,
                                                                version,
                                                                sdrRecordType,
                                                                record
                                                                );
                //SdrRecordCompact(ref str, record);
                sdrMessages.Add(sdr);

                #endregion
            }
            break;

            case SdrRecordType.Association:          // Entity Association
            case SdrRecordType.DeviceRelative:       // Device-relative Entity
            case SdrRecordType.GenericDevice:        // Generic Device Locator
            case SdrRecordType.FRUDevice:            // FRU Device Locator
            case SdrRecordType.ManagementDevice:     // Management Controller Device
            case SdrRecordType.ManagementController: // Management Controller Confirmation
            case SdrRecordType.BmcMessageChannel:    // BMC Message Channel Info
            case SdrRecordType.Oem:                  // OEM Record
            default:                                 // 0x0A = 0x0F reserved
                break;
            }
        }
Пример #5
0
        /// <summary>
        ///  Get Sensor Data Repository. Returns SDR Info.
        /// </summary>
        public virtual SdrCollection GetSdr()
        {
            // Default Record Off Set
            int offSet = 0;

            // Number of Bytes to Read. 0xFF for entire record.
            byte bytesToRead = 0xFF;

            // SDR RecordId (0000h for entry point)
            ushort recordId = 0;

            // Last SDR RecordId (aborts event log Loop)
            ushort lastRecordId = 65535;

            // security mech to step out of loop.
            int pass = 0;

            // create sdr record collection for raw SDR records.
            IpmiSdrCollection records = new IpmiSdrCollection();

            // reserve the SDR for partial reads
            ReserveSdrResponse reserve = (ReserveSdrResponse)this.IpmiSendReceive(
                new ReserveSdrRequest(), typeof(ReserveSdrResponse));

            if (reserve.CompletionCode == 0)
            {
                // reserved LS byte
                byte reserveLs = reserve.ReservationLS;

                // reserved MS byte
                byte reserveMs = reserve.ReservationMS;

                // retrieve all records while connected by recursively calling the SDR entry command
                while (recordId != lastRecordId || pass > 1000)
                {
                    // create SDR record
                    SdrRecord sdr = new SdrRecord();
                    {
                        // get the SEL record
                        GetSdrPartialResponse response = (GetSdrPartialResponse)this.IpmiSendReceive(
                            new GetSdrPartialRequest(reserveLs, reserveMs, recordId, offSet, bytesToRead), typeof(GetSdrPartialResponse));

                        if (response.CompletionCode == 0)
                        {
                            sdr.completionCode = response.CompletionCode;

                            // set record id
                            sdr.RecordId = new byte[2] {
                                response.RecordData[1], response.RecordData[0]
                            };

                            // set the record version
                            sdr.RecordVersion = response.RecordData[2];

                            // set record type
                            sdr.RecordType = response.RecordData[3];

                            // set record lenght
                            sdr.RecordLenght = response.RecordData[4];

                            // set the record data to record data
                            sdr.RecordData = response.RecordData;

                            // update the record Id (signals loop exit)
                            recordId = BitConverter.ToUInt16(new byte[2] {
                                response.RecordIdMsByte, response.RecordIdLsByte
                            }, 0);
                        }
                        else
                        {
                            sdr.completionCode = response.CompletionCode;
                            break;
                        }
                    }

                    pass++;

                    // add the record to the collection
                    records.Add(sdr);
                }
            }

            // return collection
            SdrCollection sdrMessages = new SdrCollection();

            // check response collection holds values
            if (records.Count > 0)
            {
                // sdr version array
                byte[] verarr = new byte[2];

                // record id
                short id;

                foreach (SdrRecord record in records)
                {
                    if (record.completionCode == 0)
                    {
                        // set the sdr collection completion code to indicate a failure occurred
                        sdrMessages.completionCode = record.completionCode;

                        // record Id
                        id = BitConverter.ToInt16(record.RecordId, 0);

                        // populdate version array
                        Buffer.BlockCopy(IpmiSharedFunc.ByteSplit(record.RecordVersion, new int[2] {
                            4, 0
                        }), 0, verarr, 0, 2);

                        string sVersion = Convert.ToUInt16(verarr[1]).ToString(CultureInfo.InvariantCulture) + "." + Convert.ToInt16(verarr[0]).ToString(CultureInfo.InvariantCulture);

                        // set version
                        Decimal version = 0;
                        // sdr record version number
                        if (!decimal.TryParse(sVersion, out version))
                        {
                            version = 0;
                        }

                        GetSdrMetatData(id, version, record.RecordType, record, ref sdrMessages);
                    }
                    // set the sdr completion code to indicate a failure occurred
                    sdrMessages.completionCode = record.completionCode;
                }
            }

            return(sdrMessages);
        }
Пример #6
0
        /// <summary>
        ///  Get Sensor Data Repository Information Incrementally. Returns SDR Info.
        /// </summary>
        public virtual SdrCollection GetSdrIncrement()
        {
            // Default Record Off Set
            int offSet = 0;

            // Number of Bytes to Read. 0xFF for entire record.
            int bytesToRead = 0;

            // SDR RecordId (0000h for entry point)
            ushort recordId = 0;

            // Last SDR RecordId (aborts event log Loop)
            ushort lastRecordId = 65535;

            // security mech to step out of loop.
            int pass = 0;

            // create sdr record collection for raw SDR records.
            IpmiSdrCollection records = new IpmiSdrCollection();

            // reserve the SDR for partial reads
            ReserveSdrResponse reserve = (ReserveSdrResponse)this.IpmiSendReceive(
                new ReserveSdrRequest(), typeof(ReserveSdrResponse));

            if (reserve.CompletionCode == 0)
            {
                // reserved LS byte
                byte reserveLs = reserve.ReservationLS;

                // reserved MS byte
                byte reserveMs = reserve.ReservationMS;

                // lenght of the SDR record
                int recordLenght = 0;

                // sdr record index
                int index = 0;

                // retrieve all records while connected by recursively calling the SDR entry command
                while (recordId != lastRecordId || pass > 1000)
                {
                    // create SDR record
                    SdrRecord sdr = new SdrRecord();
                    {
                        // initialize offset to zero for new record
                        offSet = 0;

                        // initialize to the minimum read size of 5 bytes. (extended to 14 on incremental read)
                        bytesToRead = 5;

                        // get the SEL record
                        GetSdrPartialResponse response = (GetSdrPartialResponse)this.IpmiSendReceive(
                            new GetSdrPartialRequest(reserveLs, reserveMs, recordId, offSet, bytesToRead), typeof(GetSdrPartialResponse));

                        // set the sdr completion code.
                        sdr.completionCode = response.CompletionCode;

                        if (response.CompletionCode == 0)
                        {
                            // set record id
                            sdr.RecordId = new byte[2] {
                                response.RecordData[1], response.RecordData[0]
                            };

                            // set the record version
                            sdr.RecordVersion = response.RecordData[2];

                            // set record type
                            sdr.RecordType = response.RecordData[3];

                            // set record lenght
                            sdr.RecordLenght = response.RecordData[4];

                            // convert record lenght to int & add the initial 5 bytes.
                            recordLenght = (Convert.ToInt32(response.RecordData[4])) + 5;

                            // create SDR byte array to hold record data.
                            byte[] sdrDataRecord = new byte[recordLenght];

                            // initilize sdr array index to zero
                            index = 0;

                            // copy SDR data to the sdr data record array and increase the index
                            Buffer.BlockCopy(response.RecordData, 0, sdrDataRecord, index, bytesToRead);
                            index += bytesToRead;

                            // increase the offset by bytes already read
                            offSet += bytesToRead;

                            int offsetPass = 0;

                            // recursively get partial sdr record until the offset reaches the recordlenght
                            while (offSet < recordLenght || offsetPass > 100)
                            {
                                // get maximum read chunk (14 bytes or less).
                                bytesToRead = (recordLenght - offSet);
                                // the size to 14 byte increments
                                bytesToRead = (bytesToRead > 14) ? 14 : bytesToRead;

                                // get partial SDR record
                                GetSdrPartialResponse partialResponse = (GetSdrPartialResponse)this.IpmiSendReceive(
                                    new GetSdrPartialRequest(reserve.ReservationLS, reserve.ReservationMS, recordId, offSet, bytesToRead), typeof(GetSdrPartialResponse));

                                if (partialResponse.CompletionCode == 0)
                                {
                                    // copy SDR data to the sdr data array and increase the index size by bytes read.
                                    Buffer.BlockCopy(partialResponse.RecordData, 0, sdrDataRecord, index, bytesToRead);
                                    index += bytesToRead;

                                    // increase the offset by the bytes read
                                    offSet += bytesToRead;
                                }
                                else
                                {
                                    // set the sdr completion code.
                                    sdr.completionCode = partialResponse.CompletionCode;
                                    break;
                                }

                                offsetPass++;
                            }

                            // set the record data to the fully populdated sdrDataRecord array
                            sdr.RecordData = sdrDataRecord;

                            // update the record Id (signals loop exit)
                            recordId = BitConverter.ToUInt16(new byte[2] {
                                response.RecordIdMsByte, response.RecordIdLsByte
                            }, 0);
                        }
                        else
                        {
                            break;
                        }
                    }

                    pass++;

                    // add the record to the collection
                    records.Add(sdr);
                }
            }

            // return collection
            SdrCollection sdrMessages = new SdrCollection();

            sdrMessages.completionCode = reserve.CompletionCode;

            if (reserve.CompletionCode != 0)
            {
                sdrMessages.command = typeof(ReserveSdrResponse).ToString();
            }

            // check response collection holds values
            if (records.Count > 0)
            {
                // sdr version array
                byte[] verarr = new byte[2];

                // record id
                short id;

                foreach (SdrRecord record in records)
                {
                    if (record.completionCode == 0)
                    {
                        // record Id
                        id = BitConverter.ToInt16(record.RecordId, 0);

                        // populdate version array
                        Buffer.BlockCopy(IpmiSharedFunc.ByteSplit(record.RecordVersion, new int[2] {
                            4, 0
                        }), 0, verarr, 0, 2);

                        string sVersion = Convert.ToUInt16(verarr[1]).ToString(CultureInfo.InvariantCulture) + "." + Convert.ToInt16(verarr[0]).ToString(CultureInfo.InvariantCulture);

                        // set version
                        Decimal version = 0;
                        // sdr record version number
                        if (!decimal.TryParse(sVersion, out version))
                        {
                            version = 0;
                        }

                        GetSdrMetatData(id, version, record.RecordType, record, ref sdrMessages);
                    }
                    else
                    {
                        sdrMessages.command       += " : " + sdrMessages.completionCode + ". RecordId:" + record.RecordId.ToString();
                        sdrMessages.completionCode = record.completionCode;
                    }
                }
            }

            return(sdrMessages);
        }