blob: d847f89b758cc6fe54ecfaaed849d94f4454b216 [file]
#pragma once
#include <stdint.h>
#include <sdbusplus/message/types.hpp>
#include <xyz/openbmc_project/Association/Definitions/server.hpp>
#include <xyz/openbmc_project/Inventory/Item/NetworkAdapter/server.hpp>
#include <xyz/openbmc_project/Inventory/Item/Port/server.hpp>
#include <sdbusplus/timer.hpp>
#include <bitset>
#include <format>
#include <map>
#include <set>
#include <string>
#include <unordered_map>
#include <variant>
#include <vector>
namespace pldm
{
using eid = uint8_t;
using Request = std::vector<uint8_t>;
using Response = std::vector<uint8_t>;
using Command = uint8_t;
using NetworkAdapterInterface = sdbusplus::server::object_t<
sdbusplus::xyz::openbmc_project::Inventory::Item::server::NetworkAdapter>;
using PortInterface = sdbusplus::server::object_t<
sdbusplus::xyz::openbmc_project::Inventory::Item::server::Port>;
using AssociationDefinitionsInterface = sdbusplus::server::object_t<
sdbusplus::xyz::openbmc_project::Association::server::Definitions>;
struct PLDMEntity
{
uint16_t entityType;
uint16_t instNum;
uint16_t containerId;
std::string toString() const
{
return std::format("(Type:{}, Inst:{}, Container:{})", entityType,
instNum, containerId);
}
bool operator==(const PLDMEntity& other) const
{
return (entityType == other.entityType && instNum == other.instNum &&
containerId == other.containerId);
}
};
struct PLDMEntityHasher
{
std::size_t operator()(const PLDMEntity& k) const
{
std::size_t res = 17;
res = res * 31 + std::hash<uint16_t>()(k.entityType);
res = res * 31 + std::hash<uint16_t>()(k.instNum);
res = res * 31 + std::hash<uint16_t>()(k.containerId);
return res;
}
};
class InventoryBase
{
protected:
PLDMEntity entity;
std::string name;
std::string inventoryPath;
std::string parentInventoryPath;
public:
InventoryBase(const PLDMEntity& entity, const std::string& name,
const std::string& inventoryPath,
const std::string& parentInventoryPath) :
entity(entity), name(name), inventoryPath(inventoryPath),
parentInventoryPath(parentInventoryPath)
{}
std::string getInventoryPath() const
{
return inventoryPath;
}
// Make InventoryBase class polymoprphic by adding a virtual
// destructor
virtual ~InventoryBase() {}
virtual void setHealthState([[maybe_unused]] const std::string& health) {}
inline static const std::string HealthStateOK = "OK";
inline static const std::string HealthStateWarning = "Warning";
inline static const std::string HealthStateCritical = "Critical";
inline static const std::string Unknown = "Unknown";
};
class NicInventory : public InventoryBase
{
public:
NicInventory(sdbusplus::bus::bus& bus, const PLDMEntity& entity,
const std::string& name, const std::string& inventoryPath,
const std::string& parentInventoryPath) :
InventoryBase(entity, name, inventoryPath, parentInventoryPath)
{
nicInterface = std::make_shared<NetworkAdapterInterface>(
bus, inventoryPath.c_str());
nicInterface->statusHealth(Unknown);
association = std::make_shared<AssociationDefinitionsInterface>(
bus, inventoryPath.c_str());
association->associations(
{{"chassis", "network_adapter", parentInventoryPath}});
}
void setHealthState(const std::string& health)
{
if (nicInterface)
{
nicInterface->statusHealth(health);
}
}
private:
std::shared_ptr<NetworkAdapterInterface> nicInterface;
std::shared_ptr<AssociationDefinitionsInterface> association;
};
class PortInventory : public InventoryBase
{
public:
PortInventory(sdbusplus::bus::bus& bus, const PLDMEntity& entity,
const std::string& name, const std::string& inventoryPath,
const std::string& parentInventoryPath) :
InventoryBase(entity, name, inventoryPath, parentInventoryPath)
{
portInterface = std::make_shared<PortInterface>(bus,
inventoryPath.c_str());
// Set default values
portInterface->linkState(LinkStateDisabled);
portInterface->linkStatus(Unknown);
portInterface->currentSpeedGbps(0);
association = std::make_shared<AssociationDefinitionsInterface>(
bus, inventoryPath.c_str());
association->associations(
{{"adapter", "all_ports", parentInventoryPath}});
}
void setSpeedGbps(double gbps)
{
if (portInterface)
{
portInterface->currentSpeedGbps(gbps);
}
}
void setLinkState(const std::string& linkState)
{
if (portInterface)
{
portInterface->linkState(linkState);
}
}
void setLinkStatus(const std::string& linkStatus)
{
if (portInterface)
{
portInterface->linkStatus(linkStatus);
}
}
public:
inline static const std::string LinkStateDisabled = "Disabled";
inline static const std::string LinkStateEnabled = "Enabled";
inline static const std::string LinkStatusLinkDown = "LinkDown";
inline static const std::string LinkStatusLinkUp = "LinkUp";
inline static const std::string LinkStatusNoLink = "NoLink";
private:
std::shared_ptr<PortInterface> portInterface;
std::shared_ptr<AssociationDefinitionsInterface> association;
};
namespace dbus
{
using ObjectPath = std::string;
using Service = std::string;
using Interface = std::string;
using Interfaces = std::vector<std::string>;
using Property = std::string;
using PropertyType = std::string;
using Value =
std::variant<bool, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t,
uint64_t, double, std::string, std::vector<uint8_t>>;
using PropertyMap = std::map<Property, Value>;
using InterfaceMap = std::map<Interface, PropertyMap>;
using ObjectValueTree = std::map<sdbusplus::message::object_path, InterfaceMap>;
} // namespace dbus
namespace fw_update
{
// Descriptor definition
using DescriptorType = uint16_t;
using DescriptorData = std::vector<uint8_t>;
using VendorDefinedDescriptorTitle = std::string;
using VendorDefinedDescriptorData = std::vector<uint8_t>;
using VendorDefinedDescriptorInfo =
std::tuple<VendorDefinedDescriptorTitle, VendorDefinedDescriptorData>;
using Descriptors =
std::map<DescriptorType,
std::variant<DescriptorData, VendorDefinedDescriptorInfo>>;
using DescriptorMap = std::unordered_map<eid, Descriptors>;
// Component information
using CompClassification = uint16_t;
using CompIdentifier = uint16_t;
using CompKey = std::pair<CompClassification, CompIdentifier>;
using CompClassificationIndex = uint8_t;
using ComponentInfo = std::map<CompKey, CompClassificationIndex>;
using ComponentInfoMap = std::unordered_map<eid, ComponentInfo>;
// PackageHeaderInformation
using PackageHeaderSize = size_t;
using PackageVersion = std::string;
using ComponentBitmapBitLength = uint16_t;
using PackageHeaderChecksum = uint32_t;
// FirmwareDeviceIDRecords
using DeviceIDRecordCount = uint8_t;
using DeviceUpdateOptionFlags = std::bitset<32>;
using ApplicableComponents = std::vector<size_t>;
using ComponentImageSetVersion = std::string;
using FirmwareDevicePackageData = std::vector<uint8_t>;
using FirmwareDeviceIDRecord =
std::tuple<DeviceUpdateOptionFlags, ApplicableComponents,
ComponentImageSetVersion, Descriptors,
FirmwareDevicePackageData>;
using FirmwareDeviceIDRecords = std::vector<FirmwareDeviceIDRecord>;
// ComponentImageInformation
using ComponentImageCount = uint16_t;
using CompComparisonStamp = uint32_t;
using CompOptions = std::bitset<16>;
using ReqCompActivationMethod = std::bitset<16>;
using CompLocationOffset = uint32_t;
using CompSize = uint32_t;
using CompVersion = std::string;
using ComponentImageInfo =
std::tuple<CompClassification, CompIdentifier, CompComparisonStamp,
CompOptions, ReqCompActivationMethod, CompLocationOffset,
CompSize, CompVersion>;
using ComponentImageInfos = std::vector<ComponentImageInfo>;
enum class ComponentImageInfoPos : size_t
{
CompClassificationPos = 0,
CompIdentifierPos = 1,
CompComparisonStampPos = 2,
CompOptionsPos = 3,
ReqCompActivationMethodPos = 4,
CompLocationOffsetPos = 5,
CompSizePos = 6,
CompVersionPos = 7,
};
} // namespace fw_update
namespace pdr
{
using EID = uint8_t;
using TerminusHandle = uint16_t;
using TerminusID = uint8_t;
using SensorID = uint16_t;
using EntityType = uint16_t;
using EntityInstance = uint16_t;
using ContainerID = uint16_t;
using StateSetId = uint16_t;
using CompositeCount = uint8_t;
using SensorOffset = uint8_t;
using EventState = uint8_t;
using TerminusValidity = uint8_t;
//!< Subset of the State Set that is supported by a effecter/sensor
using PossibleStates = std::set<uint8_t>;
//!< Subset of the State Set that is supported by each effecter/sensor in a
//!< composite efffecter/sensor
using CompositeSensorStates = std::vector<PossibleStates>;
using EntityInfo = std::tuple<ContainerID, EntityType, EntityInstance>;
using SensorInfo = std::tuple<EntityInfo, CompositeSensorStates>;
} // namespace pdr
} // namespace pldm