/// <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; }
/// <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; } }
/// <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); }
/// <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); }