blob: 31ab3a729349c2025f4e3922b7f9f42da8c50601 [file] [log] [blame]
Tom Joseph5c846a82017-04-03 01:59:39 +05301#include <host-ipmid/ipmid-api.h>
2#include <phosphor-logging/log.hpp>
3#include "main.hpp"
4#include "payload_cmds.hpp"
5#include "sol/sol_manager.hpp"
6#include "sol_cmds.hpp"
7
8namespace sol
9{
10
11namespace command
12{
13
14using namespace phosphor::logging;
15
16std::vector<uint8_t> activatePayload(std::vector<uint8_t>& inPayload,
17 const message::Handler& handler)
18{
19 std::vector<uint8_t> outPayload(sizeof(ActivatePayloadResponse));
20 auto request = reinterpret_cast<ActivatePayloadRequest*>(inPayload.data());
21 auto response = reinterpret_cast<ActivatePayloadResponse*>
22 (outPayload.data());
23
24 response->completionCode = IPMI_CC_OK;
25
26 // SOL is the payload currently supported for activation.
27 if (static_cast<uint8_t>(message::PayloadType::SOL) != request->payloadType)
28 {
29 response->completionCode = IPMI_CC_INVALID_FIELD_REQUEST;
30 return outPayload;
31 }
32
33 // Only one instance of SOL is currently supported.
34 if (request->payloadInstance != 1)
35 {
36 response->completionCode = IPMI_CC_INVALID_FIELD_REQUEST;
37 return outPayload;
38 }
39
40 auto session = (std::get<session::Manager&>(singletonPool).getSession(
41 handler.sessionID)).lock();
42
43 if (!request->encryption && session->isCryptAlgoEnabled())
44 {
45 response->completionCode = IPMI_CC_PAYLOAD_WITHOUT_ENCRYPTION;
46 return outPayload;
47 }
48
49 auto status = std::get<sol::Manager&>(singletonPool).isPayloadActive(
50 request->payloadInstance);
51 if (status)
52 {
53 response->completionCode = IPMI_CC_PAYLOAD_ALREADY_ACTIVE;
54 return outPayload;
55 }
56
57 // Set the current command's socket channel to the session
58 handler.setChannelInSession();
59
60 // Start the SOL payload
61 try
62 {
63 std::get<sol::Manager&>(singletonPool).startPayloadInstance(
64 request->payloadInstance,
65 handler.sessionID);
66 }
67 catch (std::exception& e)
68 {
69 log<level::ERR>(e.what());
70 response->completionCode = IPMI_CC_UNSPECIFIED_ERROR;
71 return outPayload;
72 }
73
74 response->inPayloadSize = endian::to_ipmi<uint16_t>(MAX_PAYLOAD_SIZE);
75 response->outPayloadSize = endian::to_ipmi<uint16_t>(MAX_PAYLOAD_SIZE);
76 response->portNum = endian::to_ipmi<uint16_t>(IPMI_STD_PORT);
77
78 // VLAN addressing is not used
79 response->vlanNum = 0xFFFF;
80
81 return outPayload;
82}
83
Tom Josephe2f0a8e2017-04-03 02:01:49 +053084std::vector<uint8_t> deactivatePayload(std::vector<uint8_t>& inPayload,
85 const message::Handler& handler)
86{
87 std::vector<uint8_t> outPayload(sizeof(DeactivatePayloadResponse));
88 auto request = reinterpret_cast<DeactivatePayloadRequest*>
89 (inPayload.data());
90 auto response = reinterpret_cast<DeactivatePayloadResponse*>
91 (outPayload.data());
92
93 response->completionCode = IPMI_CC_OK;
94
95 // SOL is the payload currently supported for deactivation
96 if (static_cast<uint8_t>(message::PayloadType::SOL) != request->payloadType)
97 {
98 response->completionCode = IPMI_CC_INVALID_FIELD_REQUEST;
99 return outPayload;
100 }
101
102 // Only one instance of SOL is supported
103 if (request->payloadInstance != 1)
104 {
105 response->completionCode = IPMI_CC_INVALID_FIELD_REQUEST;
106 return outPayload;
107 }
108
109 auto status = std::get<sol::Manager&>(singletonPool).isPayloadActive(
110 request->payloadInstance);
111 if (!status)
112 {
113 response->completionCode = IPMI_CC_PAYLOAD_DEACTIVATED;
114 return outPayload;
115 }
116
117 try
118 {
119 auto& context = std::get<sol::Manager&>(singletonPool).getContext
120 (request->payloadInstance);
121 auto sessionID = context.sessionID;
122
123 activating(request->payloadInstance, sessionID);
124 std::get<sol::Manager&>(singletonPool).stopPayloadInstance(
125 request->payloadInstance);
126
127 auto check = std::get<session::Manager&>(singletonPool).stopSession
128 (sessionID);
129 if(!check)
130 {
131 response->completionCode = IPMI_CC_UNSPECIFIED_ERROR;
132 }
133 }
134 catch (std::exception& e)
135 {
136 log<level::ERR>(e.what());
137 response->completionCode = IPMI_CC_UNSPECIFIED_ERROR;
138 return outPayload;
139 }
140
141 return outPayload;
142}
143
Tom Joseph5c846a82017-04-03 01:59:39 +0530144} // namespace command
145
146} // namespace sol
Tom Josephe2f0a8e2017-04-03 02:01:49 +0530147