xref: /openbmc/pldm/fw-update/aggregate_update_manager.cpp (revision ee2bd8ad3979dac8c41afa643e0eb24b31e70683)
1*ee2bd8adSUnive Tien #include "aggregate_update_manager.hpp"
2*ee2bd8adSUnive Tien 
3*ee2bd8adSUnive Tien namespace pldm::fw_update
4*ee2bd8adSUnive Tien {
5*ee2bd8adSUnive Tien 
handleRequest(mctp_eid_t eid,uint8_t command,const pldm_msg * request,size_t reqMsgLen)6*ee2bd8adSUnive Tien Response AggregateUpdateManager::handleRequest(
7*ee2bd8adSUnive Tien     mctp_eid_t eid, uint8_t command, const pldm_msg* request, size_t reqMsgLen)
8*ee2bd8adSUnive Tien {
9*ee2bd8adSUnive Tien     Response response;
10*ee2bd8adSUnive Tien     response = UpdateManager::handleRequest(eid, command, request, reqMsgLen);
11*ee2bd8adSUnive Tien     auto responseMsg = new (response.data()) pldm_msg;
12*ee2bd8adSUnive Tien     if (responseMsg->payload[0] != PLDM_FWUP_COMMAND_NOT_EXPECTED)
13*ee2bd8adSUnive Tien     {
14*ee2bd8adSUnive Tien         return response;
15*ee2bd8adSUnive Tien     }
16*ee2bd8adSUnive Tien     for (auto& [_, updateManager] : updateManagers)
17*ee2bd8adSUnive Tien     {
18*ee2bd8adSUnive Tien         response =
19*ee2bd8adSUnive Tien             updateManager->handleRequest(eid, command, request, reqMsgLen);
20*ee2bd8adSUnive Tien         if (responseMsg->payload[0] != PLDM_FWUP_COMMAND_NOT_EXPECTED)
21*ee2bd8adSUnive Tien         {
22*ee2bd8adSUnive Tien             return response;
23*ee2bd8adSUnive Tien         }
24*ee2bd8adSUnive Tien     }
25*ee2bd8adSUnive Tien     return response;
26*ee2bd8adSUnive Tien }
27*ee2bd8adSUnive Tien 
eraseUpdateManager(const SoftwareIdentifier & softwareIdentifier)28*ee2bd8adSUnive Tien void AggregateUpdateManager::eraseUpdateManager(
29*ee2bd8adSUnive Tien     const SoftwareIdentifier& softwareIdentifier)
30*ee2bd8adSUnive Tien {
31*ee2bd8adSUnive Tien     updateManagers.erase(softwareIdentifier);
32*ee2bd8adSUnive Tien     descriptorMap.erase(softwareIdentifier);
33*ee2bd8adSUnive Tien     componentInfoMap.erase(softwareIdentifier);
34*ee2bd8adSUnive Tien }
35*ee2bd8adSUnive Tien 
eraseUpdateManagerIf(std::function<bool (const SoftwareIdentifier &)> && predicate)36*ee2bd8adSUnive Tien void AggregateUpdateManager::eraseUpdateManagerIf(
37*ee2bd8adSUnive Tien     std::function<bool(const SoftwareIdentifier&)>&& predicate)
38*ee2bd8adSUnive Tien {
39*ee2bd8adSUnive Tien     for (auto it = updateManagers.begin(); it != updateManagers.end();)
40*ee2bd8adSUnive Tien     {
41*ee2bd8adSUnive Tien         if (predicate(it->first))
42*ee2bd8adSUnive Tien         {
43*ee2bd8adSUnive Tien             descriptorMap.erase(it->first);
44*ee2bd8adSUnive Tien             componentInfoMap.erase(it->first);
45*ee2bd8adSUnive Tien             it = updateManagers.erase(it);
46*ee2bd8adSUnive Tien         }
47*ee2bd8adSUnive Tien         else
48*ee2bd8adSUnive Tien         {
49*ee2bd8adSUnive Tien             ++it;
50*ee2bd8adSUnive Tien         }
51*ee2bd8adSUnive Tien     }
52*ee2bd8adSUnive Tien }
53*ee2bd8adSUnive Tien 
54*ee2bd8adSUnive Tien } // namespace pldm::fw_update
55