xref: /openbmc/phosphor-host-ipmid/include/ipmid/sessionhelper.hpp (revision e7023926675030a5976dffda0825445ca0b5ef84)
1*e7023926SRajashekar Gade Reddy #include <sstream>
2*e7023926SRajashekar Gade Reddy #include <string>
3*e7023926SRajashekar Gade Reddy 
4*e7023926SRajashekar Gade Reddy /**
5*e7023926SRajashekar Gade Reddy  * @brief parse session input payload.
6*e7023926SRajashekar Gade Reddy  *
7*e7023926SRajashekar Gade Reddy  * This function retrives the session id and session handle from the session
8*e7023926SRajashekar Gade Reddy  * object path.
9*e7023926SRajashekar Gade Reddy  * A valid object path will be in the form
10*e7023926SRajashekar Gade Reddy  * "/xyz/openbmc_project/ipmi/session/channel/sessionId_sessionHandle"
11*e7023926SRajashekar Gade Reddy  *
12*e7023926SRajashekar Gade Reddy  * Ex: "/xyz/openbmc_project/ipmi/session/eth0/12a4567d_8a"
13*e7023926SRajashekar Gade Reddy  * SessionId    : 0X12a4567d
14*e7023926SRajashekar Gade Reddy  * SessionHandle: 0X8a
15*e7023926SRajashekar Gade Reddy 
16*e7023926SRajashekar Gade Reddy  * @param[in] objectPath - session object path
17*e7023926SRajashekar Gade Reddy  * @param[in] sessionId - retrived session id will be asigned.
18*e7023926SRajashekar Gade Reddy  * @param[in] sessionHandle - retrived session handle will be asigned.
19*e7023926SRajashekar Gade Reddy  *
20*e7023926SRajashekar Gade Reddy  * @return true if session id and session handle are retrived else returns
21*e7023926SRajashekar Gade Reddy  * false.
22*e7023926SRajashekar Gade Reddy  */
23*e7023926SRajashekar Gade Reddy bool parseCloseSessionInputPayload(const std::string& objectPath,
24*e7023926SRajashekar Gade Reddy                                    uint32_t& sessionId, uint8_t& sessionHandle)
25*e7023926SRajashekar Gade Reddy {
26*e7023926SRajashekar Gade Reddy     if (objectPath.empty())
27*e7023926SRajashekar Gade Reddy     {
28*e7023926SRajashekar Gade Reddy         return false;
29*e7023926SRajashekar Gade Reddy     }
30*e7023926SRajashekar Gade Reddy     // getting the position of session id and session handle string from
31*e7023926SRajashekar Gade Reddy     // object path.
32*e7023926SRajashekar Gade Reddy     std::size_t ptrPosition = objectPath.rfind("/");
33*e7023926SRajashekar Gade Reddy     uint16_t tempSessionHandle = 0;
34*e7023926SRajashekar Gade Reddy 
35*e7023926SRajashekar Gade Reddy     if (ptrPosition != std::string::npos)
36*e7023926SRajashekar Gade Reddy     {
37*e7023926SRajashekar Gade Reddy         // get the sessionid & session handle string from the session object
38*e7023926SRajashekar Gade Reddy         // path Ex: sessionIdString: "12a4567d_8a"
39*e7023926SRajashekar Gade Reddy         std::string sessionIdString = objectPath.substr(ptrPosition + 1);
40*e7023926SRajashekar Gade Reddy         std::size_t pos = sessionIdString.rfind("_");
41*e7023926SRajashekar Gade Reddy 
42*e7023926SRajashekar Gade Reddy         if (pos != std::string::npos)
43*e7023926SRajashekar Gade Reddy         {
44*e7023926SRajashekar Gade Reddy             // extracting the session handle
45*e7023926SRajashekar Gade Reddy             std::string sessionHandleString = sessionIdString.substr(pos + 1);
46*e7023926SRajashekar Gade Reddy             // extracting the session id
47*e7023926SRajashekar Gade Reddy             sessionIdString = sessionIdString.substr(0, pos);
48*e7023926SRajashekar Gade Reddy             // converting session id string  and session handle string to
49*e7023926SRajashekar Gade Reddy             // hexadecimal.
50*e7023926SRajashekar Gade Reddy             std::stringstream handle(sessionHandleString);
51*e7023926SRajashekar Gade Reddy             handle >> std::hex >> tempSessionHandle;
52*e7023926SRajashekar Gade Reddy             sessionHandle = tempSessionHandle & 0xFF;
53*e7023926SRajashekar Gade Reddy             std::stringstream idString(sessionIdString);
54*e7023926SRajashekar Gade Reddy             idString >> std::hex >> sessionId;
55*e7023926SRajashekar Gade Reddy             return true;
56*e7023926SRajashekar Gade Reddy         }
57*e7023926SRajashekar Gade Reddy     }
58*e7023926SRajashekar Gade Reddy     return false;
59*e7023926SRajashekar Gade Reddy }
60*e7023926SRajashekar Gade Reddy 
61*e7023926SRajashekar Gade Reddy /**
62*e7023926SRajashekar Gade Reddy  * @brief is session object matched.
63*e7023926SRajashekar Gade Reddy  *
64*e7023926SRajashekar Gade Reddy  * This function checks whether the objectPath contains reqSessionId and
65*e7023926SRajashekar Gade Reddy  * reqSessionHandle, e.g., "/xyz/openbmc_project/ipmi/session/eth0/12a4567d_8a"
66*e7023926SRajashekar Gade Reddy  * matches sessionId 0x12a4567d and sessionHandle 0x8a.
67*e7023926SRajashekar Gade Reddy  *
68*e7023926SRajashekar Gade Reddy  * @param[in] objectPath - session object path
69*e7023926SRajashekar Gade Reddy  * @param[in] reqSessionId - request session id
70*e7023926SRajashekar Gade Reddy  * @param[in] reqSessionHandle - request session handle
71*e7023926SRajashekar Gade Reddy  *
72*e7023926SRajashekar Gade Reddy  * @return true if the object is matched else return false
73*e7023926SRajashekar Gade Reddy  **/
74*e7023926SRajashekar Gade Reddy bool isSessionObjectMatched(const std::string objectPath,
75*e7023926SRajashekar Gade Reddy                             const uint32_t reqSessionId,
76*e7023926SRajashekar Gade Reddy                             const uint8_t reqSessionHandle)
77*e7023926SRajashekar Gade Reddy {
78*e7023926SRajashekar Gade Reddy     uint32_t sessionId = 0;
79*e7023926SRajashekar Gade Reddy     uint8_t sessionHandle = 0;
80*e7023926SRajashekar Gade Reddy 
81*e7023926SRajashekar Gade Reddy     if (parseCloseSessionInputPayload(objectPath, sessionId, sessionHandle))
82*e7023926SRajashekar Gade Reddy     {
83*e7023926SRajashekar Gade Reddy         return (reqSessionId == sessionId) ||
84*e7023926SRajashekar Gade Reddy                (reqSessionHandle == sessionHandle);
85*e7023926SRajashekar Gade Reddy     }
86*e7023926SRajashekar Gade Reddy 
87*e7023926SRajashekar Gade Reddy     return false;
88*e7023926SRajashekar Gade Reddy }
89