133250240SVernon Mauery #pragma once
233250240SVernon Mauery 
3745164ccSSnehalatha Venkatesh #include <openssl/crypto.h>
433250240SVernon Mauery #include <stdint.h>
533250240SVernon Mauery 
633250240SVernon Mauery #include <sdbusplus/server.hpp>
7fbc6c9d7SPatrick Williams 
8fbc6c9d7SPatrick Williams #include <map>
933250240SVernon Mauery #include <string>
1016b8693dSVernon Mauery #include <variant>
1133250240SVernon Mauery 
1233250240SVernon Mauery namespace ipmi
1333250240SVernon Mauery {
1433250240SVernon Mauery 
1533250240SVernon Mauery using DbusObjectPath = std::string;
1633250240SVernon Mauery using DbusService = std::string;
1733250240SVernon Mauery using DbusInterface = std::string;
1833250240SVernon Mauery using DbusObjectInfo = std::pair<DbusObjectPath, DbusService>;
1933250240SVernon Mauery using DbusProperty = std::string;
2033250240SVernon Mauery 
21de54f486SWilly Tu using Association = std::tuple<std::string, std::string, std::string>;
22de54f486SWilly Tu 
2333457108SJian Zhang using Value =
2433457108SJian Zhang     std::variant<bool, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t,
2533457108SJian Zhang                  uint64_t, double, std::string, std::vector<uint8_t>,
2633457108SJian Zhang                  std::vector<uint16_t>, std::vector<uint32_t>,
27d2afd054SHao Jiang                  std::vector<std::string>, std::vector<Association>>;
2833250240SVernon Mauery 
2933250240SVernon Mauery using PropertyMap = std::map<DbusProperty, Value>;
3033250240SVernon Mauery 
3133250240SVernon Mauery using ObjectTree =
3233250240SVernon Mauery     std::map<DbusObjectPath, std::map<DbusService, std::vector<DbusInterface>>>;
3333250240SVernon Mauery 
3433250240SVernon Mauery using InterfaceList = std::vector<std::string>;
3533250240SVernon Mauery 
3633250240SVernon Mauery using DbusInterfaceMap = std::map<DbusInterface, PropertyMap>;
3733250240SVernon Mauery 
3833250240SVernon Mauery using ObjectValueTree =
3933250240SVernon Mauery     std::map<sdbusplus::message::object_path, DbusInterfaceMap>;
4033250240SVernon Mauery 
4133250240SVernon Mauery namespace sensor
4233250240SVernon Mauery {
4333250240SVernon Mauery 
4433250240SVernon Mauery using Offset = uint8_t;
4533250240SVernon Mauery 
4633250240SVernon Mauery /**
4733250240SVernon Mauery  * @enum SkipAssertion
4833250240SVernon Mauery  * Matching value for skipping the update
4933250240SVernon Mauery  */
5033250240SVernon Mauery enum class SkipAssertion
5133250240SVernon Mauery {
5233250240SVernon Mauery     NONE,     // No skip defined
5333250240SVernon Mauery     ASSERT,   // Skip on Assert
5433250240SVernon Mauery     DEASSERT, // Skip on Deassert
5533250240SVernon Mauery };
5633250240SVernon Mauery 
5733250240SVernon Mauery struct Values
5833250240SVernon Mauery {
5933250240SVernon Mauery     SkipAssertion skip;
6033250240SVernon Mauery     Value assert;
6133250240SVernon Mauery     Value deassert;
6233250240SVernon Mauery };
6333250240SVernon Mauery 
6433250240SVernon Mauery /**
6533250240SVernon Mauery  * @enum PreReqValues
6633250240SVernon Mauery  * Pre-req conditions for a property.
6733250240SVernon Mauery  */
6833250240SVernon Mauery struct PreReqValues
6933250240SVernon Mauery {
7033250240SVernon Mauery     Value assert;   // Value in case of assert.
7133250240SVernon Mauery     Value deassert; // Value in case of deassert.
7233250240SVernon Mauery };
7333250240SVernon Mauery 
7433250240SVernon Mauery using PreReqOffsetValueMap = std::map<Offset, PreReqValues>;
7533250240SVernon Mauery 
7633250240SVernon Mauery /**
7733250240SVernon Mauery  * @struct SetSensorReadingReq
7833250240SVernon Mauery  *
7933250240SVernon Mauery  * IPMI Request data for Set Sensor Reading and Event Status Command
8033250240SVernon Mauery  */
8133250240SVernon Mauery struct SetSensorReadingReq
8233250240SVernon Mauery {
8333250240SVernon Mauery     uint8_t number;
8433250240SVernon Mauery     uint8_t operation;
8533250240SVernon Mauery     uint8_t reading;
8633250240SVernon Mauery     uint8_t assertOffset0_7;
8733250240SVernon Mauery     uint8_t assertOffset8_14;
8833250240SVernon Mauery     uint8_t deassertOffset0_7;
8933250240SVernon Mauery     uint8_t deassertOffset8_14;
9033250240SVernon Mauery     uint8_t eventData1;
9133250240SVernon Mauery     uint8_t eventData2;
9233250240SVernon Mauery     uint8_t eventData3;
9333250240SVernon Mauery } __attribute__((packed));
9433250240SVernon Mauery 
9533250240SVernon Mauery /**
9633250240SVernon Mauery  * @struct GetReadingResponse
9733250240SVernon Mauery  *
9833250240SVernon Mauery  * IPMI response data for Get Sensor Reading command.
9933250240SVernon Mauery  */
10033250240SVernon Mauery struct GetReadingResponse
10133250240SVernon Mauery {
10233250240SVernon Mauery     uint8_t reading;          //!< Sensor reading.
10333250240SVernon Mauery     uint8_t operation;        //!< Sensor scanning status / reading state.
10433250240SVernon Mauery     uint8_t assertOffset0_7;  //!< Discrete assertion states(0-7).
10533250240SVernon Mauery     uint8_t assertOffset8_14; //!< Discrete assertion states(8-14).
10633250240SVernon Mauery } __attribute__((packed));
10733250240SVernon Mauery 
10833250240SVernon Mauery constexpr auto inventoryRoot = "/xyz/openbmc_project/inventory";
10933250240SVernon Mauery 
1104cc42556SSui Chen struct GetSensorResponse
1114cc42556SSui Chen {
1124cc42556SSui Chen     uint8_t reading;                     // sensor reading
1134cc42556SSui Chen     bool readingOrStateUnavailable;      // 1 = reading/state unavailable
1144cc42556SSui Chen     bool scanningEnabled;                // 0 = sensor scanning disabled
1154cc42556SSui Chen     bool allEventMessagesEnabled;        // 0 = All Event Messages disabled
1164cc42556SSui Chen     uint8_t thresholdLevelsStates;       // threshold/discrete sensor states
1174cc42556SSui Chen     uint8_t discreteReadingSensorStates; // discrete-only, optional states
1184cc42556SSui Chen };
11933250240SVernon Mauery 
12033250240SVernon Mauery using OffsetValueMap = std::map<Offset, Values>;
12133250240SVernon Mauery 
12233250240SVernon Mauery using DbusPropertyValues = std::pair<PreReqOffsetValueMap, OffsetValueMap>;
12333250240SVernon Mauery 
12433250240SVernon Mauery using DbusPropertyMap = std::map<DbusProperty, DbusPropertyValues>;
12533250240SVernon Mauery 
12633250240SVernon Mauery using DbusInterfaceMap = std::map<DbusInterface, DbusPropertyMap>;
12733250240SVernon Mauery 
12833250240SVernon Mauery using InstancePath = std::string;
12933250240SVernon Mauery using Type = uint8_t;
13033250240SVernon Mauery using ReadingType = uint8_t;
13133250240SVernon Mauery using Multiplier = uint16_t;
13233250240SVernon Mauery using OffsetB = int16_t;
13333250240SVernon Mauery using Exponent = int8_t;
13433250240SVernon Mauery using ScaledOffset = double;
13533250240SVernon Mauery using Scale = int16_t;
13633250240SVernon Mauery using Unit = std::string;
13733250240SVernon Mauery using EntityType = uint8_t;
13833250240SVernon Mauery using EntityInst = uint8_t;
13933250240SVernon Mauery using SensorName = std::string;
140c5324251STony Lee using SensorUnits1 = uint8_t;
14133250240SVernon Mauery 
14233250240SVernon Mauery enum class Mutability
14333250240SVernon Mauery {
14433250240SVernon Mauery     Read = 1 << 0,
14533250240SVernon Mauery     Write = 1 << 1,
14633250240SVernon Mauery };
14733250240SVernon Mauery 
operator |(Mutability lhs,Mutability rhs)14833250240SVernon Mauery inline Mutability operator|(Mutability lhs, Mutability rhs)
14933250240SVernon Mauery {
15033250240SVernon Mauery     return static_cast<Mutability>(static_cast<uint8_t>(lhs) |
15133250240SVernon Mauery                                    static_cast<uint8_t>(rhs));
15233250240SVernon Mauery }
15333250240SVernon Mauery 
operator &(Mutability lhs,Mutability rhs)15433250240SVernon Mauery inline Mutability operator&(Mutability lhs, Mutability rhs)
15533250240SVernon Mauery {
15633250240SVernon Mauery     return static_cast<Mutability>(static_cast<uint8_t>(lhs) &
15733250240SVernon Mauery                                    static_cast<uint8_t>(rhs));
15833250240SVernon Mauery }
15933250240SVernon Mauery 
16033250240SVernon Mauery struct Info
16133250240SVernon Mauery {
16233250240SVernon Mauery     EntityType entityType;
16333250240SVernon Mauery     EntityInst instance;
16433250240SVernon Mauery     Type sensorType;
16533250240SVernon Mauery     InstancePath sensorPath;
16633250240SVernon Mauery     DbusInterface sensorInterface;
16733250240SVernon Mauery     ReadingType sensorReadingType;
16833250240SVernon Mauery     Multiplier coefficientM;
16933250240SVernon Mauery     OffsetB coefficientB;
17033250240SVernon Mauery     Exponent exponentB;
17133250240SVernon Mauery     ScaledOffset scaledOffset;
17233250240SVernon Mauery     Exponent exponentR;
17333250240SVernon Mauery     bool hasScale;
17433250240SVernon Mauery     Scale scale;
175c5324251STony Lee     SensorUnits1 sensorUnits1;
17633250240SVernon Mauery     Unit unit;
17733250240SVernon Mauery     std::function<uint8_t(SetSensorReadingReq&, const Info&)> updateFunc;
1788c2c048eSLei YU #ifndef FEATURE_SENSORS_CACHE
17933250240SVernon Mauery     std::function<GetSensorResponse(const Info&)> getFunc;
1808c2c048eSLei YU #else
1818e8152c5SLei YU     std::function<std::optional<GetSensorResponse>(uint8_t, const Info&,
1828e8152c5SLei YU                                                    const ipmi::PropertyMap&)>
1838c2c048eSLei YU         getFunc;
1848c2c048eSLei YU #endif
18533250240SVernon Mauery     Mutability mutability;
186be4ffa87SJeremy Kerr     SensorName sensorName;
18733250240SVernon Mauery     std::function<SensorName(const Info&)> sensorNameFunc;
18833250240SVernon Mauery     DbusInterfaceMap propertyInterfaces;
18933250240SVernon Mauery };
19033250240SVernon Mauery 
19133250240SVernon Mauery using Id = uint8_t;
19233250240SVernon Mauery using IdInfoMap = std::map<Id, Info>;
19333250240SVernon Mauery 
19433250240SVernon Mauery using PropertyMap = ipmi::PropertyMap;
19533250240SVernon Mauery 
19633250240SVernon Mauery using InterfaceMap = std::map<DbusInterface, PropertyMap>;
19733250240SVernon Mauery 
19833250240SVernon Mauery using Object = sdbusplus::message::object_path;
19933250240SVernon Mauery using ObjectMap = std::map<Object, InterfaceMap>;
20033250240SVernon Mauery 
2015d82f474SPatrick Williams using IpmiUpdateData = sdbusplus::message_t;
20233250240SVernon Mauery 
20333250240SVernon Mauery struct SelData
20433250240SVernon Mauery {
20533250240SVernon Mauery     Id sensorID;
20633250240SVernon Mauery     Type sensorType;
20733250240SVernon Mauery     ReadingType eventReadingType;
20833250240SVernon Mauery     Offset eventOffset;
20933250240SVernon Mauery };
21033250240SVernon Mauery 
21133250240SVernon Mauery using InventoryPath = std::string;
21233250240SVernon Mauery 
21333250240SVernon Mauery using InvObjectIDMap = std::map<InventoryPath, SelData>;
21433250240SVernon Mauery 
21533250240SVernon Mauery enum class ThresholdMask
21633250240SVernon Mauery {
21733250240SVernon Mauery     NON_CRITICAL_LOW_MASK = 0x01,
21833250240SVernon Mauery     CRITICAL_LOW_MASK = 0x02,
21933250240SVernon Mauery     NON_CRITICAL_HIGH_MASK = 0x08,
22033250240SVernon Mauery     CRITICAL_HIGH_MASK = 0x10,
22133250240SVernon Mauery };
22233250240SVernon Mauery 
22333250240SVernon Mauery static constexpr uint8_t maxContainedEntities = 4;
22433250240SVernon Mauery using ContainedEntitiesArray =
22533250240SVernon Mauery     std::array<std::pair<uint8_t, uint8_t>, maxContainedEntities>;
22633250240SVernon Mauery 
22733250240SVernon Mauery struct EntityInfo
22833250240SVernon Mauery {
22933250240SVernon Mauery     uint8_t containerEntityId;
23033250240SVernon Mauery     uint8_t containerEntityInstance;
23133250240SVernon Mauery     bool isList;
23233250240SVernon Mauery     bool isLinked;
23333250240SVernon Mauery     ContainedEntitiesArray containedEntities;
23433250240SVernon Mauery };
23533250240SVernon Mauery 
23633250240SVernon Mauery using EntityInfoMap = std::map<Id, EntityInfo>;
23733250240SVernon Mauery 
2389714050fSLei YU #ifdef FEATURE_SENSORS_CACHE
2399714050fSLei YU /**
2409714050fSLei YU  * @struct SensorData
2419714050fSLei YU  *
2429714050fSLei YU  * The data to cache for sensors
2439714050fSLei YU  */
2449714050fSLei YU struct SensorData
2459714050fSLei YU {
2469714050fSLei YU     double value;
2479714050fSLei YU     bool available;
2489714050fSLei YU     bool functional;
2499714050fSLei YU     GetSensorResponse response;
2509714050fSLei YU };
2519714050fSLei YU 
2529714050fSLei YU using SensorCacheMap = std::map<uint8_t, std::optional<SensorData>>;
2539714050fSLei YU #endif
2549714050fSLei YU 
25533250240SVernon Mauery } // namespace sensor
25633250240SVernon Mauery 
25733250240SVernon Mauery namespace network
25833250240SVernon Mauery {
25933250240SVernon Mauery constexpr auto MAC_ADDRESS_FORMAT = "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx";
26033250240SVernon Mauery 
26133250240SVernon Mauery constexpr auto IPV4_ADDRESS_SIZE_BYTE = 4;
26233250240SVernon Mauery constexpr auto IPV6_ADDRESS_SIZE_BYTE = 16;
26333250240SVernon Mauery 
26433250240SVernon Mauery constexpr auto DEFAULT_MAC_ADDRESS = "00:00:00:00:00:00";
26533250240SVernon Mauery constexpr auto DEFAULT_ADDRESS = "0.0.0.0";
26633250240SVernon Mauery 
26733250240SVernon Mauery } // namespace network
268c514d874SWilliam A. Kennington III 
269745164ccSSnehalatha Venkatesh template <typename T>
270745164ccSSnehalatha Venkatesh class SecureAllocator : public std::allocator<T>
271745164ccSSnehalatha Venkatesh {
272745164ccSSnehalatha Venkatesh   public:
273*57f4941cSPeter Foley     template <typename U>
274*57f4941cSPeter Foley     struct rebind
275*57f4941cSPeter Foley     {
276*57f4941cSPeter Foley         typedef SecureAllocator<U> other;
277*57f4941cSPeter Foley     };
278*57f4941cSPeter Foley 
deallocate(T * p,size_t n)279745164ccSSnehalatha Venkatesh     void deallocate(T* p, size_t n)
280745164ccSSnehalatha Venkatesh     {
281745164ccSSnehalatha Venkatesh         OPENSSL_cleanse(p, n);
282745164ccSSnehalatha Venkatesh         return std::allocator<T>::deallocate(p, n);
283745164ccSSnehalatha Venkatesh     }
284745164ccSSnehalatha Venkatesh };
28576889090SWilly Tu 
28676889090SWilly Tu using SecureStringBase =
287745164ccSSnehalatha Venkatesh     std::basic_string<char, std::char_traits<char>, SecureAllocator<char>>;
28876889090SWilly Tu class SecureString : public SecureStringBase
28976889090SWilly Tu {
29076889090SWilly Tu   public:
29176889090SWilly Tu     using SecureStringBase::basic_string;
SecureString(const SecureStringBase & other)29276889090SWilly Tu     SecureString(const SecureStringBase& other) : SecureStringBase(other){};
29376889090SWilly Tu     SecureString(SecureString&) = default;
29476889090SWilly Tu     SecureString(const SecureString&) = default;
29576889090SWilly Tu     SecureString(SecureString&&) = default;
29676889090SWilly Tu     SecureString& operator=(SecureString&&) = default;
29776889090SWilly Tu     SecureString& operator=(const SecureString&) = default;
298745164ccSSnehalatha Venkatesh 
~SecureString()29976889090SWilly Tu     ~SecureString()
30076889090SWilly Tu     {
30145d41931SWilly Tu         OPENSSL_cleanse(this->data(), this->size());
30276889090SWilly Tu     }
30376889090SWilly Tu };
304997952afSVernon Mauery 
30576889090SWilly Tu using SecureBufferBase = std::vector<uint8_t, SecureAllocator<uint8_t>>;
30676889090SWilly Tu 
30776889090SWilly Tu class SecureBuffer : public SecureBufferBase
30876889090SWilly Tu {
30976889090SWilly Tu   public:
31076889090SWilly Tu     using SecureBufferBase::vector;
SecureBuffer(const SecureBufferBase & other)31176889090SWilly Tu     SecureBuffer(const SecureBufferBase& other) : SecureBufferBase(other){};
31276889090SWilly Tu     SecureBuffer(SecureBuffer&) = default;
31376889090SWilly Tu     SecureBuffer(const SecureBuffer&) = default;
31476889090SWilly Tu     SecureBuffer(SecureBuffer&&) = default;
31576889090SWilly Tu     SecureBuffer& operator=(SecureBuffer&&) = default;
31676889090SWilly Tu     SecureBuffer& operator=(const SecureBuffer&) = default;
31776889090SWilly Tu 
~SecureBuffer()31876889090SWilly Tu     ~SecureBuffer()
31976889090SWilly Tu     {
32045d41931SWilly Tu         OPENSSL_cleanse(this->data(), this->size());
32176889090SWilly Tu     }
32276889090SWilly Tu };
32333250240SVernon Mauery } // namespace ipmi
324