xref: /openbmc/pldm/fw-update/aggregate_update_manager.hpp (revision ee2bd8ad3979dac8c41afa643e0eb24b31e70683)
1*ee2bd8adSUnive Tien #pragma once
2*ee2bd8adSUnive Tien 
3*ee2bd8adSUnive Tien #include "update_manager.hpp"
4*ee2bd8adSUnive Tien 
5*ee2bd8adSUnive Tien namespace pldm::fw_update
6*ee2bd8adSUnive Tien {
7*ee2bd8adSUnive Tien 
8*ee2bd8adSUnive Tien class AggregateUpdateManager : public UpdateManager
9*ee2bd8adSUnive Tien {
10*ee2bd8adSUnive Tien   public:
11*ee2bd8adSUnive Tien     AggregateUpdateManager() = delete;
12*ee2bd8adSUnive Tien     AggregateUpdateManager(const AggregateUpdateManager&) = delete;
13*ee2bd8adSUnive Tien     AggregateUpdateManager(AggregateUpdateManager&&) = delete;
14*ee2bd8adSUnive Tien     AggregateUpdateManager& operator=(const AggregateUpdateManager&) = delete;
15*ee2bd8adSUnive Tien     AggregateUpdateManager& operator=(AggregateUpdateManager&&) = delete;
16*ee2bd8adSUnive Tien 
17*ee2bd8adSUnive Tien     /**
18*ee2bd8adSUnive Tien      * @brief Constructor for AggregateUpdateManager
19*ee2bd8adSUnive Tien      *
20*ee2bd8adSUnive Tien      * @param[in] event - Reference to the PLDM daemon's main event loop
21*ee2bd8adSUnive Tien      * @param[in] handler - PLDM request handler
22*ee2bd8adSUnive Tien      * @param[in] instanceIdDb - Reference to the instance ID database
23*ee2bd8adSUnive Tien      * @param[in] descriptorMap - Descriptor map for the update manager
24*ee2bd8adSUnive Tien      * @param[in] componentInfoMap - Component information map for the update
25*ee2bd8adSUnive Tien      * manager
26*ee2bd8adSUnive Tien      */
AggregateUpdateManager(Event & event,pldm::requester::Handler<pldm::requester::Request> & handler,InstanceIdDb & instanceIdDb,const DescriptorMap & descriptorMap,const ComponentInfoMap & componentInfoMap)27*ee2bd8adSUnive Tien     explicit AggregateUpdateManager(
28*ee2bd8adSUnive Tien         Event& event,
29*ee2bd8adSUnive Tien         pldm::requester::Handler<pldm::requester::Request>& handler,
30*ee2bd8adSUnive Tien         InstanceIdDb& instanceIdDb, const DescriptorMap& descriptorMap,
31*ee2bd8adSUnive Tien         const ComponentInfoMap& componentInfoMap) :
32*ee2bd8adSUnive Tien         UpdateManager(event, handler, instanceIdDb, descriptorMap,
33*ee2bd8adSUnive Tien                       componentInfoMap)
34*ee2bd8adSUnive Tien     {}
35*ee2bd8adSUnive Tien 
36*ee2bd8adSUnive Tien     /**
37*ee2bd8adSUnive Tien      * @brief Handle PLDM requests for the aggregate update manager
38*ee2bd8adSUnive Tien      *
39*ee2bd8adSUnive Tien      * This function processes incoming PLDM requests and dispatches them to the
40*ee2bd8adSUnive Tien      * appropriate update manager based on the software identifier.
41*ee2bd8adSUnive Tien      *
42*ee2bd8adSUnive Tien      * @param[in] eid - Remote MCTP Endpoint ID
43*ee2bd8adSUnive Tien      * @param[in] command - PLDM command code
44*ee2bd8adSUnive Tien      * @param[in] request - PLDM request message
45*ee2bd8adSUnive Tien      * @param[in] reqMsgLen - PLDM request message length
46*ee2bd8adSUnive Tien      * @return PLDM response message
47*ee2bd8adSUnive Tien      */
48*ee2bd8adSUnive Tien     Response handleRequest(mctp_eid_t eid, uint8_t command,
49*ee2bd8adSUnive Tien                            const pldm_msg* request, size_t reqMsgLen) override;
50*ee2bd8adSUnive Tien 
51*ee2bd8adSUnive Tien     /**
52*ee2bd8adSUnive Tien      * @brief Create a new UpdateManager instance for a specific software
53*ee2bd8adSUnive Tien      * identifier
54*ee2bd8adSUnive Tien      *
55*ee2bd8adSUnive Tien      * This function creates and stores a new UpdateManager instance associated
56*ee2bd8adSUnive Tien      * with the given software identifier, along with its corresponding
57*ee2bd8adSUnive Tien      * descriptor and component information maps.
58*ee2bd8adSUnive Tien      *
59*ee2bd8adSUnive Tien      * @param[in] softwareIdentifier - The software identifier (pair of eid and
60*ee2bd8adSUnive Tien      * component identifier)
61*ee2bd8adSUnive Tien      * @param[in] descriptors - The descriptors associated with the software
62*ee2bd8adSUnive Tien      * identifier
63*ee2bd8adSUnive Tien      * @param[in] componentInfo - The component information associated with the
64*ee2bd8adSUnive Tien      * software identifier
65*ee2bd8adSUnive Tien      * @param[in] updateObjPath - The D-Bus object path for the update manager
66*ee2bd8adSUnive Tien      */
67*ee2bd8adSUnive Tien     void createUpdateManager(const SoftwareIdentifier& softwareIdentifier,
68*ee2bd8adSUnive Tien                              const Descriptors& descriptors,
69*ee2bd8adSUnive Tien                              const ComponentInfo& componentInfo,
70*ee2bd8adSUnive Tien                              const std::string& updateObjPath);
71*ee2bd8adSUnive Tien 
72*ee2bd8adSUnive Tien     /**
73*ee2bd8adSUnive Tien      * @brief Erase an existing UpdateManager instance associated with a
74*ee2bd8adSUnive Tien      * specific software identifier
75*ee2bd8adSUnive Tien      *
76*ee2bd8adSUnive Tien      * This function removes the UpdateManager instance and its associated
77*ee2bd8adSUnive Tien      * descriptor and component information maps from the internal storage based
78*ee2bd8adSUnive Tien      * on the provided software identifier.
79*ee2bd8adSUnive Tien      *
80*ee2bd8adSUnive Tien      * @param[in] softwareIdentifier - The software identifier (pair of eid and
81*ee2bd8adSUnive Tien      * component identifier)
82*ee2bd8adSUnive Tien      */
83*ee2bd8adSUnive Tien     void eraseUpdateManager(const SoftwareIdentifier& softwareIdentifier);
84*ee2bd8adSUnive Tien 
85*ee2bd8adSUnive Tien     /**
86*ee2bd8adSUnive Tien      * @brief Erase UpdateManager instances that satisfy a given predicate
87*ee2bd8adSUnive Tien      *
88*ee2bd8adSUnive Tien      * This function iterates through the stored UpdateManager instances and
89*ee2bd8adSUnive Tien      * removes those that satisfy the provided predicate function. It also
90*ee2bd8adSUnive Tien      * removes the associated descriptor and component information maps.
91*ee2bd8adSUnive Tien      *
92*ee2bd8adSUnive Tien      * @param[in] predicate - A function that takes a SoftwareIdentifier and
93*ee2bd8adSUnive Tien      * returns true if the corresponding UpdateManager should be erased
94*ee2bd8adSUnive Tien      */
95*ee2bd8adSUnive Tien     void eraseUpdateManagerIf(
96*ee2bd8adSUnive Tien         std::function<bool(const SoftwareIdentifier&)>&& predicate);
97*ee2bd8adSUnive Tien 
98*ee2bd8adSUnive Tien   private:
99*ee2bd8adSUnive Tien     /**
100*ee2bd8adSUnive Tien      * @brief Map of UpdateManager instances keyed by software identifier
101*ee2bd8adSUnive Tien      */
102*ee2bd8adSUnive Tien     std::map<SoftwareIdentifier, std::unique_ptr<UpdateManager>> updateManagers;
103*ee2bd8adSUnive Tien 
104*ee2bd8adSUnive Tien     /**
105*ee2bd8adSUnive Tien      * @brief Map of descriptor maps keyed by software identifier
106*ee2bd8adSUnive Tien      */
107*ee2bd8adSUnive Tien     std::map<SoftwareIdentifier, std::unique_ptr<Descriptors>> descriptorMap;
108*ee2bd8adSUnive Tien 
109*ee2bd8adSUnive Tien     /**
110*ee2bd8adSUnive Tien      * @brief Map of component information maps keyed by software identifier
111*ee2bd8adSUnive Tien      */
112*ee2bd8adSUnive Tien     std::map<SoftwareIdentifier, std::unique_ptr<ComponentInfo>>
113*ee2bd8adSUnive Tien         componentInfoMap;
114*ee2bd8adSUnive Tien };
115*ee2bd8adSUnive Tien 
116*ee2bd8adSUnive Tien } // namespace pldm::fw_update
117