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