1 #pragma once 2 3 #include <chrono> 4 #include <cstdint> 5 #include <ipmid/types.hpp> 6 #include <sdbusplus/server.hpp> 7 8 namespace ipmi 9 { 10 11 namespace sel 12 { 13 14 static constexpr auto mapperBusName = "xyz.openbmc_project.ObjectMapper"; 15 static constexpr auto mapperObjPath = "/xyz/openbmc_project/object_mapper"; 16 static constexpr auto mapperIntf = "xyz.openbmc_project.ObjectMapper"; 17 18 static constexpr auto logBasePath = "/xyz/openbmc_project/logging/entry"; 19 static constexpr auto logEntryIntf = "xyz.openbmc_project.Logging.Entry"; 20 static constexpr auto logDeleteIntf = "xyz.openbmc_project.Object.Delete"; 21 22 static constexpr auto propIntf = "org.freedesktop.DBus.Properties"; 23 24 using ObjectPaths = std::vector<std::string>; 25 using PropertyName = std::string; 26 using Resolved = bool; 27 using Id = uint32_t; 28 using Timestamp = uint64_t; 29 using Message = std::string; 30 using AdditionalData = std::vector<std::string>; 31 using PropertyType = sdbusplus::message::variant<Resolved, Id, Timestamp, 32 Message, AdditionalData>; 33 34 static constexpr auto selVersion = 0x51; 35 static constexpr auto invalidTimeStamp = 0xFFFFFFFF; 36 static constexpr auto operationSupport = 0x0A; 37 38 /** @struct GetSELInfoResponse 39 * 40 * IPMI payload for Get SEL Info command response. 41 */ 42 struct GetSELInfoResponse 43 { 44 uint8_t selVersion; //!< SEL revision. 45 uint16_t entries; //!< Number of log entries in SEL. 46 uint16_t freeSpace; //!< Free Space in bytes. 47 uint32_t addTimeStamp; //!< Most recent addition timestamp. 48 uint32_t eraseTimeStamp; //!< Most recent erase timestamp. 49 uint8_t operationSupport; //!< Operation support. 50 } __attribute__((packed)); 51 52 static constexpr auto firstEntry = 0x0000; 53 static constexpr auto lastEntry = 0xFFFF; 54 static constexpr auto entireRecord = 0xFF; 55 static constexpr auto selRecordSize = 16; 56 57 /** @struct GetSELEntryRequest 58 * 59 * IPMI payload for Get SEL Entry command request. 60 */ 61 struct GetSELEntryRequest 62 { 63 uint16_t reservationID; //!< Reservation ID. 64 uint16_t selRecordID; //!< SEL Record ID. 65 uint8_t offset; //!< Offset into record. 66 uint8_t readLength; //!< Bytes to read. 67 } __attribute__((packed)); 68 69 /** @struct GetSELEntryResponse 70 * 71 * IPMI payload for Get SEL Entry command response. 72 */ 73 struct GetSELEntryResponse 74 { 75 uint16_t nextRecordID; //!< Next RecordID. 76 uint16_t recordID; //!< Record ID. 77 uint8_t recordType; //!< Record Type. 78 uint32_t timeStamp; //!< Timestamp. 79 uint16_t generatorID; //!< Generator ID. 80 uint8_t eventMsgRevision; //!< Event Message Revision. 81 uint8_t sensorType; //!< Sensor Type. 82 uint8_t sensorNum; //!< Sensor Number. 83 uint8_t eventType; //!< Event Dir | Event Type. 84 uint8_t eventData1; //!< Event Data 1. 85 uint8_t eventData2; //!< Event Data 2. 86 uint8_t eventData3; //!< Event Data 3. 87 } __attribute__((packed)); 88 89 /** @struct DeleteSELEntryRequest 90 * 91 * IPMI payload for Delete SEL Entry command request. 92 */ 93 struct DeleteSELEntryRequest 94 { 95 uint16_t reservationID; //!< Reservation ID. 96 uint16_t selRecordID; //!< SEL Record ID. 97 } __attribute__((packed)); 98 99 static constexpr auto initiateErase = 0xAA; 100 static constexpr auto getEraseStatus = 0x00; 101 static constexpr auto eraseComplete = 0x01; 102 103 /** @struct ClearSELRequest 104 * 105 * IPMI payload for Clear SEL command request. 106 */ 107 struct ClearSELRequest 108 { 109 uint16_t reservationID; //!< Reservation ID. 110 uint8_t charC; //!< Char 'C'(0x43h). 111 uint8_t charL; //!< Char 'L'(0x4Ch). 112 uint8_t charR; //!< Char 'R'(0x52h). 113 uint8_t eraseOperation; //!< Erase operation. 114 } __attribute__((packed)); 115 116 /** @brief Convert logging entry to SEL 117 * 118 * @param[in] objPath - DBUS object path of the logging entry. 119 * 120 * @return On success return the response of Get SEL entry command. 121 */ 122 GetSELEntryResponse convertLogEntrytoSEL(const std::string& objPath); 123 124 /** @brief Get the timestamp of the log entry 125 * 126 * @param[in] objPath - DBUS object path of the logging entry. 127 * 128 * @return On success return the timestamp of the log entry as number of 129 * seconds from epoch. 130 */ 131 std::chrono::seconds getEntryTimeStamp(const std::string& objPath); 132 133 /** @brief Read the logging entry object paths 134 * 135 * This API would read the logging dbus logging entry object paths and sorting 136 * the filename in the numeric order. The paths is cleared before populating 137 * the object paths. 138 * 139 * @param[in,out] paths - sorted list of logging entry object paths. 140 * 141 * @note This function is invoked when the Get SEL Info command or the Delete 142 * SEL entry command is invoked. The Get SEL Entry command is preceded 143 * typically by Get SEL Info command, so readLoggingObjectPaths is not 144 * invoked before each Get SEL entry command. 145 */ 146 void readLoggingObjectPaths(ObjectPaths& paths); 147 148 namespace internal 149 { 150 151 /** @brief Convert logging entry to SEL event record 152 * 153 * @param[in] objPath - DBUS object path of the logging entry. 154 * @param[in] iter - Iterator to the sensor data corresponding to the logging 155 * entry 156 * 157 * @return On success return the SEL event record, throw an exception in case 158 * of failure. 159 */ 160 GetSELEntryResponse 161 prepareSELEntry(const std::string& objPath, 162 ipmi::sensor::InvObjectIDMap::const_iterator iter); 163 164 } // namespace internal 165 166 } // namespace sel 167 168 } // namespace ipmi 169