xref: /openbmc/openpower-vpd-parser/vpd-manager/src/parser.cpp (revision fa5e4d325ef9cea3c841fe89d202c340f92bd8c6)
1*fa5e4d32SSunny Srivastava #include "parser.hpp"
2*fa5e4d32SSunny Srivastava 
3*fa5e4d32SSunny Srivastava #include "constants.hpp"
4*fa5e4d32SSunny Srivastava #include "event_logger.hpp"
5*fa5e4d32SSunny Srivastava 
6*fa5e4d32SSunny Srivastava #include <utility/dbus_utility.hpp>
7*fa5e4d32SSunny Srivastava #include <utility/json_utility.hpp>
8*fa5e4d32SSunny Srivastava #include <utility/vpd_specific_utility.hpp>
9*fa5e4d32SSunny Srivastava 
10*fa5e4d32SSunny Srivastava #include <fstream>
11*fa5e4d32SSunny Srivastava 
12*fa5e4d32SSunny Srivastava namespace vpd
13*fa5e4d32SSunny Srivastava {
Parser(const std::string & vpdFilePath,nlohmann::json parsedJson)14*fa5e4d32SSunny Srivastava Parser::Parser(const std::string& vpdFilePath, nlohmann::json parsedJson) :
15*fa5e4d32SSunny Srivastava     m_vpdFilePath(vpdFilePath), m_parsedJson(parsedJson)
16*fa5e4d32SSunny Srivastava {
17*fa5e4d32SSunny Srivastava     std::error_code l_errCode;
18*fa5e4d32SSunny Srivastava 
19*fa5e4d32SSunny Srivastava     // ToDo: Add minimum file size check in all the concert praser classes,
20*fa5e4d32SSunny Srivastava     // depends on their VPD type.
21*fa5e4d32SSunny Srivastava     if (!std::filesystem::exists(m_vpdFilePath, l_errCode))
22*fa5e4d32SSunny Srivastava     {
23*fa5e4d32SSunny Srivastava         std::string l_message{"Parser object creation failed, file [" +
24*fa5e4d32SSunny Srivastava                               m_vpdFilePath + "] doesn't exists."};
25*fa5e4d32SSunny Srivastava 
26*fa5e4d32SSunny Srivastava         if (l_errCode)
27*fa5e4d32SSunny Srivastava         {
28*fa5e4d32SSunny Srivastava             l_message += " Error message: " + l_errCode.message();
29*fa5e4d32SSunny Srivastava         }
30*fa5e4d32SSunny Srivastava 
31*fa5e4d32SSunny Srivastava         throw std::runtime_error(l_message);
32*fa5e4d32SSunny Srivastava     }
33*fa5e4d32SSunny Srivastava 
34*fa5e4d32SSunny Srivastava     // Read VPD offset if applicable.
35*fa5e4d32SSunny Srivastava     if (!m_parsedJson.empty())
36*fa5e4d32SSunny Srivastava     {
37*fa5e4d32SSunny Srivastava         m_vpdStartOffset = jsonUtility::getVPDOffset(m_parsedJson, vpdFilePath);
38*fa5e4d32SSunny Srivastava     }
39*fa5e4d32SSunny Srivastava }
40*fa5e4d32SSunny Srivastava 
getVpdParserInstance()41*fa5e4d32SSunny Srivastava std::shared_ptr<vpd::ParserInterface> Parser::getVpdParserInstance()
42*fa5e4d32SSunny Srivastava {
43*fa5e4d32SSunny Srivastava     // Read the VPD data into a vector.
44*fa5e4d32SSunny Srivastava     vpdSpecificUtility::getVpdDataInVector(m_vpdFilePath, m_vpdVector,
45*fa5e4d32SSunny Srivastava                                            m_vpdStartOffset);
46*fa5e4d32SSunny Srivastava 
47*fa5e4d32SSunny Srivastava     // This will detect the type of parser required.
48*fa5e4d32SSunny Srivastava     std::shared_ptr<vpd::ParserInterface> l_parser =
49*fa5e4d32SSunny Srivastava         ParserFactory::getParser(m_vpdVector, m_vpdFilePath, m_vpdStartOffset);
50*fa5e4d32SSunny Srivastava 
51*fa5e4d32SSunny Srivastava     return l_parser;
52*fa5e4d32SSunny Srivastava }
53*fa5e4d32SSunny Srivastava 
parse()54*fa5e4d32SSunny Srivastava types::VPDMapVariant Parser::parse()
55*fa5e4d32SSunny Srivastava {
56*fa5e4d32SSunny Srivastava     std::shared_ptr<vpd::ParserInterface> l_parser = getVpdParserInstance();
57*fa5e4d32SSunny Srivastava     return l_parser->parse();
58*fa5e4d32SSunny Srivastava }
59*fa5e4d32SSunny Srivastava 
updateVpdKeyword(const types::WriteVpdParams & i_paramsToWriteData)60*fa5e4d32SSunny Srivastava int Parser::updateVpdKeyword(const types::WriteVpdParams& i_paramsToWriteData)
61*fa5e4d32SSunny Srivastava {
62*fa5e4d32SSunny Srivastava     int l_bytesUpdatedOnHardware = constants::FAILURE;
63*fa5e4d32SSunny Srivastava 
64*fa5e4d32SSunny Srivastava     // A lambda to extract Record : Keyword string from i_paramsToWriteData
65*fa5e4d32SSunny Srivastava     auto l_keyWordIdentifier =
66*fa5e4d32SSunny Srivastava         [](const types::WriteVpdParams& i_paramsToWriteData) -> std::string {
67*fa5e4d32SSunny Srivastava         std::string l_keywordString{};
68*fa5e4d32SSunny Srivastava         if (const types::IpzData* l_ipzData =
69*fa5e4d32SSunny Srivastava                 std::get_if<types::IpzData>(&i_paramsToWriteData))
70*fa5e4d32SSunny Srivastava         {
71*fa5e4d32SSunny Srivastava             l_keywordString =
72*fa5e4d32SSunny Srivastava                 std::get<0>(*l_ipzData) + ":" + std::get<1>(*l_ipzData);
73*fa5e4d32SSunny Srivastava         }
74*fa5e4d32SSunny Srivastava         else if (const types::KwData* l_kwData =
75*fa5e4d32SSunny Srivastava                      std::get_if<types::KwData>(&i_paramsToWriteData))
76*fa5e4d32SSunny Srivastava         {
77*fa5e4d32SSunny Srivastava             l_keywordString = std::get<0>(*l_kwData);
78*fa5e4d32SSunny Srivastava         }
79*fa5e4d32SSunny Srivastava         return l_keywordString;
80*fa5e4d32SSunny Srivastava     };
81*fa5e4d32SSunny Srivastava 
82*fa5e4d32SSunny Srivastava     try
83*fa5e4d32SSunny Srivastava     {
84*fa5e4d32SSunny Srivastava         // Enable Reboot Guard
85*fa5e4d32SSunny Srivastava         if (constants::FAILURE == dbusUtility::EnableRebootGuard())
86*fa5e4d32SSunny Srivastava         {
87*fa5e4d32SSunny Srivastava             EventLogger::createAsyncPel(
88*fa5e4d32SSunny Srivastava                 types::ErrorType::DbusFailure,
89*fa5e4d32SSunny Srivastava                 types::SeverityType::Informational, __FILE__, __FUNCTION__, 0,
90*fa5e4d32SSunny Srivastava                 std::string(
91*fa5e4d32SSunny Srivastava                     "Failed to enable BMC Reboot Guard while updating " +
92*fa5e4d32SSunny Srivastava                     l_keyWordIdentifier(i_paramsToWriteData)),
93*fa5e4d32SSunny Srivastava                 std::nullopt, std::nullopt, std::nullopt, std::nullopt);
94*fa5e4d32SSunny Srivastava 
95*fa5e4d32SSunny Srivastava             return constants::FAILURE;
96*fa5e4d32SSunny Srivastava         }
97*fa5e4d32SSunny Srivastava 
98*fa5e4d32SSunny Srivastava         // Update keyword's value on hardware
99*fa5e4d32SSunny Srivastava         try
100*fa5e4d32SSunny Srivastava         {
101*fa5e4d32SSunny Srivastava             std::shared_ptr<ParserInterface> l_vpdParserInstance =
102*fa5e4d32SSunny Srivastava                 getVpdParserInstance();
103*fa5e4d32SSunny Srivastava             l_bytesUpdatedOnHardware =
104*fa5e4d32SSunny Srivastava                 l_vpdParserInstance->writeKeywordOnHardware(
105*fa5e4d32SSunny Srivastava                     i_paramsToWriteData);
106*fa5e4d32SSunny Srivastava         }
107*fa5e4d32SSunny Srivastava         catch (const std::exception& l_exception)
108*fa5e4d32SSunny Srivastava         {
109*fa5e4d32SSunny Srivastava             std::string l_errMsg(
110*fa5e4d32SSunny Srivastava                 "Error while updating keyword's value on hardware path " +
111*fa5e4d32SSunny Srivastava                 m_vpdFilePath + ", error: " + std::string(l_exception.what()));
112*fa5e4d32SSunny Srivastava 
113*fa5e4d32SSunny Srivastava             // TODO : Log PEL
114*fa5e4d32SSunny Srivastava 
115*fa5e4d32SSunny Srivastava             throw std::runtime_error(l_errMsg);
116*fa5e4d32SSunny Srivastava         }
117*fa5e4d32SSunny Srivastava 
118*fa5e4d32SSunny Srivastava         auto [l_fruPath, l_inventoryObjPath, l_redundantFruPath] =
119*fa5e4d32SSunny Srivastava             jsonUtility::getAllPathsToUpdateKeyword(m_parsedJson,
120*fa5e4d32SSunny Srivastava                                                     m_vpdFilePath);
121*fa5e4d32SSunny Srivastava 
122*fa5e4d32SSunny Srivastava         // If inventory D-bus object path is present, update keyword's value on
123*fa5e4d32SSunny Srivastava         // DBus
124*fa5e4d32SSunny Srivastava         if (!l_inventoryObjPath.empty())
125*fa5e4d32SSunny Srivastava         {
126*fa5e4d32SSunny Srivastava             types::Record l_recordName;
127*fa5e4d32SSunny Srivastava             std::string l_interfaceName;
128*fa5e4d32SSunny Srivastava             std::string l_propertyName;
129*fa5e4d32SSunny Srivastava             types::DbusVariantType l_keywordValue;
130*fa5e4d32SSunny Srivastava 
131*fa5e4d32SSunny Srivastava             if (const types::IpzData* l_ipzData =
132*fa5e4d32SSunny Srivastava                     std::get_if<types::IpzData>(&i_paramsToWriteData))
133*fa5e4d32SSunny Srivastava             {
134*fa5e4d32SSunny Srivastava                 l_recordName = std::get<0>(*l_ipzData);
135*fa5e4d32SSunny Srivastava                 l_interfaceName = constants::ipzVpdInf + l_recordName;
136*fa5e4d32SSunny Srivastava                 l_propertyName = std::get<1>(*l_ipzData);
137*fa5e4d32SSunny Srivastava 
138*fa5e4d32SSunny Srivastava                 try
139*fa5e4d32SSunny Srivastava                 {
140*fa5e4d32SSunny Srivastava                     // Read keyword's value from hardware to write the same on
141*fa5e4d32SSunny Srivastava                     // D-bus.
142*fa5e4d32SSunny Srivastava                     std::shared_ptr<ParserInterface> l_vpdParserInstance =
143*fa5e4d32SSunny Srivastava                         getVpdParserInstance();
144*fa5e4d32SSunny Srivastava 
145*fa5e4d32SSunny Srivastava                     logging::logMessage(
146*fa5e4d32SSunny Srivastava                         "Performing VPD read on " + m_vpdFilePath);
147*fa5e4d32SSunny Srivastava 
148*fa5e4d32SSunny Srivastava                     l_keywordValue =
149*fa5e4d32SSunny Srivastava                         l_vpdParserInstance->readKeywordFromHardware(
150*fa5e4d32SSunny Srivastava                             types::ReadVpdParams(
151*fa5e4d32SSunny Srivastava                                 std::make_tuple(l_recordName, l_propertyName)));
152*fa5e4d32SSunny Srivastava                 }
153*fa5e4d32SSunny Srivastava                 catch (const std::exception& l_exception)
154*fa5e4d32SSunny Srivastava                 {
155*fa5e4d32SSunny Srivastava                     // Unable to read keyword's value from hardware.
156*fa5e4d32SSunny Srivastava                     std::string l_errMsg(
157*fa5e4d32SSunny Srivastava                         "Error while reading keyword's value from hadware path " +
158*fa5e4d32SSunny Srivastava                         m_vpdFilePath +
159*fa5e4d32SSunny Srivastava                         ", error: " + std::string(l_exception.what()));
160*fa5e4d32SSunny Srivastava 
161*fa5e4d32SSunny Srivastava                     // TODO: Log PEL
162*fa5e4d32SSunny Srivastava 
163*fa5e4d32SSunny Srivastava                     throw std::runtime_error(l_errMsg);
164*fa5e4d32SSunny Srivastava                 }
165*fa5e4d32SSunny Srivastava             }
166*fa5e4d32SSunny Srivastava             else
167*fa5e4d32SSunny Srivastava             {
168*fa5e4d32SSunny Srivastava                 // Input parameter type provided isn't compatible to perform
169*fa5e4d32SSunny Srivastava                 // update.
170*fa5e4d32SSunny Srivastava                 std::string l_errMsg(
171*fa5e4d32SSunny Srivastava                     "Input parameter type isn't compatible to update keyword's value on DBus for object path: " +
172*fa5e4d32SSunny Srivastava                     l_inventoryObjPath);
173*fa5e4d32SSunny Srivastava                 throw std::runtime_error(l_errMsg);
174*fa5e4d32SSunny Srivastava             }
175*fa5e4d32SSunny Srivastava 
176*fa5e4d32SSunny Srivastava             // Get D-bus name for the given keyword
177*fa5e4d32SSunny Srivastava             l_propertyName =
178*fa5e4d32SSunny Srivastava                 vpdSpecificUtility::getDbusPropNameForGivenKw(l_propertyName);
179*fa5e4d32SSunny Srivastava 
180*fa5e4d32SSunny Srivastava             // Create D-bus object map
181*fa5e4d32SSunny Srivastava             types::ObjectMap l_dbusObjMap = {std::make_pair(
182*fa5e4d32SSunny Srivastava                 l_inventoryObjPath,
183*fa5e4d32SSunny Srivastava                 types::InterfaceMap{std::make_pair(
184*fa5e4d32SSunny Srivastava                     l_interfaceName, types::PropertyMap{std::make_pair(
185*fa5e4d32SSunny Srivastava                                          l_propertyName, l_keywordValue)})})};
186*fa5e4d32SSunny Srivastava 
187*fa5e4d32SSunny Srivastava             // Call PIM's Notify method to perform update
188*fa5e4d32SSunny Srivastava             if (!dbusUtility::callPIM(std::move(l_dbusObjMap)))
189*fa5e4d32SSunny Srivastava             {
190*fa5e4d32SSunny Srivastava                 // Call to PIM's Notify method failed.
191*fa5e4d32SSunny Srivastava                 std::string l_errMsg("Notify PIM is failed for object path: " +
192*fa5e4d32SSunny Srivastava                                      l_inventoryObjPath);
193*fa5e4d32SSunny Srivastava                 throw std::runtime_error(l_errMsg);
194*fa5e4d32SSunny Srivastava             }
195*fa5e4d32SSunny Srivastava         }
196*fa5e4d32SSunny Srivastava 
197*fa5e4d32SSunny Srivastava         // Update keyword's value on redundant hardware if present
198*fa5e4d32SSunny Srivastava         if (!l_redundantFruPath.empty())
199*fa5e4d32SSunny Srivastava         {
200*fa5e4d32SSunny Srivastava             if (updateVpdKeywordOnRedundantPath(l_redundantFruPath,
201*fa5e4d32SSunny Srivastava                                                 i_paramsToWriteData) < 0)
202*fa5e4d32SSunny Srivastava             {
203*fa5e4d32SSunny Srivastava                 std::string l_errMsg(
204*fa5e4d32SSunny Srivastava                     "Error while updating keyword's value on redundant path " +
205*fa5e4d32SSunny Srivastava                     l_redundantFruPath);
206*fa5e4d32SSunny Srivastava                 throw std::runtime_error(l_errMsg);
207*fa5e4d32SSunny Srivastava             }
208*fa5e4d32SSunny Srivastava         }
209*fa5e4d32SSunny Srivastava 
210*fa5e4d32SSunny Srivastava         // TODO: Check if revert is required when any of the writes fails.
211*fa5e4d32SSunny Srivastava         // TODO: Handle error logging
212*fa5e4d32SSunny Srivastava     }
213*fa5e4d32SSunny Srivastava     catch (const std::exception& l_ex)
214*fa5e4d32SSunny Srivastava     {
215*fa5e4d32SSunny Srivastava         logging::logMessage("Update VPD Keyword failed for : " +
216*fa5e4d32SSunny Srivastava                             l_keyWordIdentifier(i_paramsToWriteData) +
217*fa5e4d32SSunny Srivastava                             " failed due to error: " + l_ex.what());
218*fa5e4d32SSunny Srivastava 
219*fa5e4d32SSunny Srivastava         // update failed, set return value to failure
220*fa5e4d32SSunny Srivastava         l_bytesUpdatedOnHardware = constants::FAILURE;
221*fa5e4d32SSunny Srivastava     }
222*fa5e4d32SSunny Srivastava 
223*fa5e4d32SSunny Srivastava     // Disable Reboot Guard
224*fa5e4d32SSunny Srivastava     if (constants::FAILURE == dbusUtility::DisableRebootGuard())
225*fa5e4d32SSunny Srivastava     {
226*fa5e4d32SSunny Srivastava         EventLogger::createAsyncPel(
227*fa5e4d32SSunny Srivastava             types::ErrorType::DbusFailure, types::SeverityType::Critical,
228*fa5e4d32SSunny Srivastava             __FILE__, __FUNCTION__, 0,
229*fa5e4d32SSunny Srivastava             std::string("Failed to disable BMC Reboot Guard while updating " +
230*fa5e4d32SSunny Srivastava                         l_keyWordIdentifier(i_paramsToWriteData)),
231*fa5e4d32SSunny Srivastava             std::nullopt, std::nullopt, std::nullopt, std::nullopt);
232*fa5e4d32SSunny Srivastava     }
233*fa5e4d32SSunny Srivastava 
234*fa5e4d32SSunny Srivastava     return l_bytesUpdatedOnHardware;
235*fa5e4d32SSunny Srivastava }
236*fa5e4d32SSunny Srivastava 
updateVpdKeywordOnRedundantPath(const std::string & i_fruPath,const types::WriteVpdParams & i_paramsToWriteData)237*fa5e4d32SSunny Srivastava int Parser::updateVpdKeywordOnRedundantPath(
238*fa5e4d32SSunny Srivastava     const std::string& i_fruPath,
239*fa5e4d32SSunny Srivastava     const types::WriteVpdParams& i_paramsToWriteData)
240*fa5e4d32SSunny Srivastava {
241*fa5e4d32SSunny Srivastava     try
242*fa5e4d32SSunny Srivastava     {
243*fa5e4d32SSunny Srivastava         std::shared_ptr<Parser> l_parserObj =
244*fa5e4d32SSunny Srivastava             std::make_shared<Parser>(i_fruPath, m_parsedJson);
245*fa5e4d32SSunny Srivastava 
246*fa5e4d32SSunny Srivastava         std::shared_ptr<ParserInterface> l_vpdParserInstance =
247*fa5e4d32SSunny Srivastava             l_parserObj->getVpdParserInstance();
248*fa5e4d32SSunny Srivastava 
249*fa5e4d32SSunny Srivastava         return l_vpdParserInstance->writeKeywordOnHardware(i_paramsToWriteData);
250*fa5e4d32SSunny Srivastava     }
251*fa5e4d32SSunny Srivastava     catch (const std::exception& l_exception)
252*fa5e4d32SSunny Srivastava     {
253*fa5e4d32SSunny Srivastava         EventLogger::createSyncPel(
254*fa5e4d32SSunny Srivastava             types::ErrorType::InvalidVpdMessage,
255*fa5e4d32SSunny Srivastava             types::SeverityType::Informational, __FILE__, __FUNCTION__, 0,
256*fa5e4d32SSunny Srivastava             "Error while updating keyword's value on redundant path " +
257*fa5e4d32SSunny Srivastava                 i_fruPath + ", error: " + std::string(l_exception.what()),
258*fa5e4d32SSunny Srivastava             std::nullopt, std::nullopt, std::nullopt, std::nullopt);
259*fa5e4d32SSunny Srivastava         return -1;
260*fa5e4d32SSunny Srivastava     }
261*fa5e4d32SSunny Srivastava }
262*fa5e4d32SSunny Srivastava 
updateVpdKeywordOnHardware(const types::WriteVpdParams & i_paramsToWriteData)263*fa5e4d32SSunny Srivastava int Parser::updateVpdKeywordOnHardware(
264*fa5e4d32SSunny Srivastava     const types::WriteVpdParams& i_paramsToWriteData)
265*fa5e4d32SSunny Srivastava {
266*fa5e4d32SSunny Srivastava     int l_bytesUpdatedOnHardware = constants::FAILURE;
267*fa5e4d32SSunny Srivastava 
268*fa5e4d32SSunny Srivastava     // A lambda to extract Record : Keyword string from i_paramsToWriteData
269*fa5e4d32SSunny Srivastava     auto l_keyWordIdentifier =
270*fa5e4d32SSunny Srivastava         [](const types::WriteVpdParams& i_paramsToWriteData) -> std::string {
271*fa5e4d32SSunny Srivastava         std::string l_keywordString{};
272*fa5e4d32SSunny Srivastava         if (const types::IpzData* l_ipzData =
273*fa5e4d32SSunny Srivastava                 std::get_if<types::IpzData>(&i_paramsToWriteData))
274*fa5e4d32SSunny Srivastava         {
275*fa5e4d32SSunny Srivastava             l_keywordString =
276*fa5e4d32SSunny Srivastava                 std::get<0>(*l_ipzData) + ":" + std::get<1>(*l_ipzData);
277*fa5e4d32SSunny Srivastava         }
278*fa5e4d32SSunny Srivastava         else if (const types::KwData* l_kwData =
279*fa5e4d32SSunny Srivastava                      std::get_if<types::KwData>(&i_paramsToWriteData))
280*fa5e4d32SSunny Srivastava         {
281*fa5e4d32SSunny Srivastava             l_keywordString = std::get<0>(*l_kwData);
282*fa5e4d32SSunny Srivastava         }
283*fa5e4d32SSunny Srivastava         return l_keywordString;
284*fa5e4d32SSunny Srivastava     };
285*fa5e4d32SSunny Srivastava 
286*fa5e4d32SSunny Srivastava     try
287*fa5e4d32SSunny Srivastava     {
288*fa5e4d32SSunny Srivastava         // Enable Reboot Guard
289*fa5e4d32SSunny Srivastava         if (constants::FAILURE == dbusUtility::EnableRebootGuard())
290*fa5e4d32SSunny Srivastava         {
291*fa5e4d32SSunny Srivastava             EventLogger::createAsyncPel(
292*fa5e4d32SSunny Srivastava                 types::ErrorType::DbusFailure,
293*fa5e4d32SSunny Srivastava                 types::SeverityType::Informational, __FILE__, __FUNCTION__, 0,
294*fa5e4d32SSunny Srivastava                 std::string(
295*fa5e4d32SSunny Srivastava                     "Failed to enable BMC Reboot Guard while updating " +
296*fa5e4d32SSunny Srivastava                     l_keyWordIdentifier(i_paramsToWriteData)),
297*fa5e4d32SSunny Srivastava                 std::nullopt, std::nullopt, std::nullopt, std::nullopt);
298*fa5e4d32SSunny Srivastava 
299*fa5e4d32SSunny Srivastava             return constants::FAILURE;
300*fa5e4d32SSunny Srivastava         }
301*fa5e4d32SSunny Srivastava 
302*fa5e4d32SSunny Srivastava         std::shared_ptr<ParserInterface> l_vpdParserInstance =
303*fa5e4d32SSunny Srivastava             getVpdParserInstance();
304*fa5e4d32SSunny Srivastava         l_bytesUpdatedOnHardware =
305*fa5e4d32SSunny Srivastava             l_vpdParserInstance->writeKeywordOnHardware(i_paramsToWriteData);
306*fa5e4d32SSunny Srivastava     }
307*fa5e4d32SSunny Srivastava     catch (const std::exception& l_exception)
308*fa5e4d32SSunny Srivastava     {
309*fa5e4d32SSunny Srivastava         types::ErrorType l_errorType;
310*fa5e4d32SSunny Srivastava 
311*fa5e4d32SSunny Srivastava         if (typeid(l_exception) == typeid(EccException))
312*fa5e4d32SSunny Srivastava         {
313*fa5e4d32SSunny Srivastava             l_errorType = types::ErrorType::EccCheckFailed;
314*fa5e4d32SSunny Srivastava         }
315*fa5e4d32SSunny Srivastava         else
316*fa5e4d32SSunny Srivastava         {
317*fa5e4d32SSunny Srivastava             l_errorType = types::ErrorType::InvalidVpdMessage;
318*fa5e4d32SSunny Srivastava         }
319*fa5e4d32SSunny Srivastava 
320*fa5e4d32SSunny Srivastava         EventLogger::createAsyncPel(
321*fa5e4d32SSunny Srivastava             l_errorType, types::SeverityType::Informational, __FILE__,
322*fa5e4d32SSunny Srivastava             __FUNCTION__, 0,
323*fa5e4d32SSunny Srivastava             "Error while updating keyword's value on hardware path [" +
324*fa5e4d32SSunny Srivastava                 m_vpdFilePath + "], error: " + std::string(l_exception.what()),
325*fa5e4d32SSunny Srivastava             std::nullopt, std::nullopt, std::nullopt, std::nullopt);
326*fa5e4d32SSunny Srivastava     }
327*fa5e4d32SSunny Srivastava 
328*fa5e4d32SSunny Srivastava     // Disable Reboot Guard
329*fa5e4d32SSunny Srivastava     if (constants::FAILURE == dbusUtility::DisableRebootGuard())
330*fa5e4d32SSunny Srivastava     {
331*fa5e4d32SSunny Srivastava         EventLogger::createAsyncPel(
332*fa5e4d32SSunny Srivastava             types::ErrorType::DbusFailure, types::SeverityType::Critical,
333*fa5e4d32SSunny Srivastava             __FILE__, __FUNCTION__, 0,
334*fa5e4d32SSunny Srivastava             std::string("Failed to disable BMC Reboot Guard while updating " +
335*fa5e4d32SSunny Srivastava                         l_keyWordIdentifier(i_paramsToWriteData)),
336*fa5e4d32SSunny Srivastava             std::nullopt, std::nullopt, std::nullopt, std::nullopt);
337*fa5e4d32SSunny Srivastava     }
338*fa5e4d32SSunny Srivastava 
339*fa5e4d32SSunny Srivastava     return l_bytesUpdatedOnHardware;
340*fa5e4d32SSunny Srivastava }
341*fa5e4d32SSunny Srivastava 
342*fa5e4d32SSunny Srivastava } // namespace vpd
343