blob: 09d2a71dff85d3e9f7d66cb5593198a31e31cf23 [file] [log] [blame]
AppaRao Puli071f3f22018-05-24 16:45:30 +05301/*
2// Copyright (c) 2018 Intel Corporation
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15*/
16
17#pragma once
18#include "channel_layer.hpp"
19
20#include <boost/interprocess/sync/file_lock.hpp>
21#include <boost/interprocess/sync/named_recursive_mutex.hpp>
22#include <cstdint>
23#include <ctime>
24#include <nlohmann/json.hpp>
25#include <sdbusplus/bus.hpp>
26
27namespace ipmi
28{
29
30using Json = nlohmann::json;
31
AppaRao Puli9613ed72018-09-01 23:46:44 +053032using DbusVariant =
33 sdbusplus::message::variant<std::vector<std::string>, std::string, bool>;
34
35using DbusChObjProperties = std::vector<std::pair<std::string, DbusVariant>>;
36
AppaRao Puli071f3f22018-05-24 16:45:30 +053037static constexpr const char* ipmiChannelMutex = "ipmi_channel_mutex";
38static constexpr const char* ipmiChMutexCleanupLockFile =
39 "/var/lib/ipmi/ipmi_channel_mutex_cleanup";
40
41struct ChannelAccessData
42{
43 ChannelAccess chNonVolatileData;
44 ChannelAccess chVolatileData;
45};
46
47struct ChannelData
48{
49 std::string chName;
50 uint8_t chID;
51 bool isChValid;
52 uint8_t activeSessCount;
53 ChannelInfo chInfo;
54 ChannelAccessData chAccess;
55};
56
57class ChannelConfig;
58
59ChannelConfig& getChannelConfigObject();
60
61class ChannelConfig
62{
63 public:
64 ChannelConfig(const ChannelConfig&) = delete;
65 ChannelConfig& operator=(const ChannelConfig&) = delete;
66 ChannelConfig(ChannelConfig&&) = delete;
67 ChannelConfig& operator=(ChannelConfig&&) = delete;
68
AppaRao Puli9613ed72018-09-01 23:46:44 +053069 ~ChannelConfig();
AppaRao Puli071f3f22018-05-24 16:45:30 +053070 ChannelConfig();
71
72 /** @brief determines valid channel
73 *
74 * @param[in] chNum - channel number
75 *
76 * @return true if valid, false otherwise
77 */
Richard Marian Thomaiyara45cb342018-12-03 15:08:59 +053078 bool isValidChannel(const uint8_t chNum);
AppaRao Puli071f3f22018-05-24 16:45:30 +053079
80 /** @brief determines valid authentication type
81 *
82 * @param[in] chNum - channel number
83 * @param[in] authType - authentication type
84 *
85 * @return true if valid, false otherwise
86 */
Richard Marian Thomaiyara45cb342018-12-03 15:08:59 +053087 bool isValidAuthType(const uint8_t chNum, const EAuthType& authType);
AppaRao Puli071f3f22018-05-24 16:45:30 +053088
89 /** @brief determines supported session type of a channel
90 *
91 * @param[in] chNum - channel number
92 *
93 * @return EChannelSessSupported - supported session type
94 */
Richard Marian Thomaiyara45cb342018-12-03 15:08:59 +053095 EChannelSessSupported getChannelSessionSupport(const uint8_t chNum);
AppaRao Puli071f3f22018-05-24 16:45:30 +053096
97 /** @brief determines number of active sessions on a channel
98 *
99 * @param[in] chNum - channel number
100 *
101 * @return numer of active sessions
102 */
Richard Marian Thomaiyara45cb342018-12-03 15:08:59 +0530103 int getChannelActiveSessions(const uint8_t chNum);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530104
105 /** @brief provides channel info details
106 *
107 * @param[in] chNum - channel number
108 * @param[out] chInfo - channel info details
109 *
110 * @return IPMI_CC_OK for success, others for failure.
111 */
Richard Marian Thomaiyara45cb342018-12-03 15:08:59 +0530112 ipmi_ret_t getChannelInfo(const uint8_t chNum, ChannelInfo& chInfo);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530113
114 /** @brief provides channel access data
115 *
116 * @param[in] chNum - channel number
117 * @param[out] chAccessData - channel access data
118 *
119 * @return IPMI_CC_OK for success, others for failure.
120 */
Richard Marian Thomaiyara45cb342018-12-03 15:08:59 +0530121 ipmi_ret_t getChannelAccessData(const uint8_t chNum,
AppaRao Puli071f3f22018-05-24 16:45:30 +0530122 ChannelAccess& chAccessData);
123
124 /** @brief to set channel access data
125 *
126 * @param[in] chNum - channel number
127 * @param[in] chAccessData - channel access data
128 * @param[in] setFlag - flag to indicate updatable fields
129 *
130 * @return IPMI_CC_OK for success, others for failure.
131 */
Richard Marian Thomaiyara45cb342018-12-03 15:08:59 +0530132 ipmi_ret_t setChannelAccessData(const uint8_t chNum,
AppaRao Puli071f3f22018-05-24 16:45:30 +0530133 const ChannelAccess& chAccessData,
Richard Marian Thomaiyara45cb342018-12-03 15:08:59 +0530134 const uint8_t setFlag);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530135
136 /** @brief to get channel access data persistent data
137 *
138 * @param[in] chNum - channel number
139 * @param[out] chAccessData - channel access data
140 *
141 * @return IPMI_CC_OK for success, others for failure.
142 */
Richard Marian Thomaiyara45cb342018-12-03 15:08:59 +0530143 ipmi_ret_t getChannelAccessPersistData(const uint8_t chNum,
AppaRao Puli071f3f22018-05-24 16:45:30 +0530144 ChannelAccess& chAccessData);
145
146 /** @brief to set channel access data persistent data
147 *
148 * @param[in] chNum - channel number
149 * @param[in] chAccessData - channel access data
150 * @param[in] setFlag - flag to indicate updatable fields
151 *
152 * @return IPMI_CC_OK for success, others for failure.
153 */
Richard Marian Thomaiyara45cb342018-12-03 15:08:59 +0530154 ipmi_ret_t setChannelAccessPersistData(const uint8_t chNum,
AppaRao Puli071f3f22018-05-24 16:45:30 +0530155 const ChannelAccess& chAccessData,
Richard Marian Thomaiyara45cb342018-12-03 15:08:59 +0530156 const uint8_t setFlag);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530157
158 /** @brief provides supported authentication type for the channel
159 *
160 * @param[in] chNum - channel number
161 * @param[out] authTypeSupported - supported authentication type
162 *
163 * @return IPMI_CC_OK for success, others for failure.
164 */
Richard Marian Thomaiyara45cb342018-12-03 15:08:59 +0530165 ipmi_ret_t getChannelAuthTypeSupported(const uint8_t chNum,
AppaRao Puli071f3f22018-05-24 16:45:30 +0530166 uint8_t& authTypeSupported);
167
168 /** @brief provides enabled authentication type for the channel
169 *
170 * @param[in] chNum - channel number
171 * @param[in] priv - privilege
172 * @param[out] authType - enabled authentication type
173 *
174 * @return IPMI_CC_OK for success, others for failure.
175 */
Richard Marian Thomaiyara45cb342018-12-03 15:08:59 +0530176 ipmi_ret_t getChannelEnabledAuthType(const uint8_t chNum,
177 const uint8_t priv,
AppaRao Puli071f3f22018-05-24 16:45:30 +0530178 EAuthType& authType);
179
AppaRao Puli9613ed72018-09-01 23:46:44 +0530180 /** @brief conver to channel privilege from system privilege
181 *
182 * @param[in] value - privilege value
183 *
184 * @return Channel privilege
185 */
186 CommandPrivilege convertToPrivLimitIndex(const std::string& value);
187
188 /** @brief function to write persistent channel configuration to config file
189 *
190 * @return 0 for success, -errno for failure.
191 */
192 int writeChannelPersistData();
193
194 /** @brief function to write volatile channel configuration to config file
195 *
196 * @return 0 for success, -errno for failure.
197 */
198 int writeChannelVolatileData();
199
200 /** @brief function to get channel data based on channel number
201 *
202 * @param[in] chNum - channel number
203 *
204 * @return 0 for success, -errno for failure.
205 */
Richard Marian Thomaiyara45cb342018-12-03 15:08:59 +0530206 ChannelData* getChannelDataPtr(const uint8_t chNum);
AppaRao Puli9613ed72018-09-01 23:46:44 +0530207
208 uint32_t signalFlag = 0;
209
AppaRao Puli071f3f22018-05-24 16:45:30 +0530210 std::unique_ptr<boost::interprocess::named_recursive_mutex> channelMutex{
211 nullptr};
212
213 private:
214 ChannelData channelData[maxIpmiChannels];
215 std::time_t nvFileLastUpdatedTime;
216 std::time_t voltFileLastUpdatedTime;
217 std::time_t getUpdatedFileTime(const std::string& fileName);
218 boost::interprocess::file_lock mutexCleanupLock;
219 sdbusplus::bus::bus bus;
AppaRao Puli9613ed72018-09-01 23:46:44 +0530220 bool signalHndlrObjectState = false;
221 boost::interprocess::file_lock sigHndlrLock;
AppaRao Puli071f3f22018-05-24 16:45:30 +0530222
223 /** @brief function to initialize persistent channel configuration
224 *
225 */
226 void initChannelPersistData();
227
228 /** @brief function to set default channel configuration based on channel
229 * number
230 *
231 * @param[in] chNum - channel number
232 * @param[in] chName - channel name
233 */
Richard Marian Thomaiyara45cb342018-12-03 15:08:59 +0530234 void setDefaultChannelConfig(const uint8_t chNum,
AppaRao Puli071f3f22018-05-24 16:45:30 +0530235 const std::string& chName);
236
237 /** @brief function to load all channel configuration
238 *
239 * @return 0 for success, -errno for failure.
240 */
241 int loadChannelConfig();
242
243 /** @brief function to read persistent channel data
244 *
245 * @return 0 for success, -errno for failure.
246 */
247 int readChannelPersistData();
248
AppaRao Puli071f3f22018-05-24 16:45:30 +0530249 /** @brief function to read volatile channel data
250 *
251 * @return 0 for success, -errno for failure.
252 */
253 int readChannelVolatileData();
254
AppaRao Puli071f3f22018-05-24 16:45:30 +0530255 /** @brief function to check and reload persistent channel data
256 *
257 * @return 0 for success, -errno for failure.
258 */
259 int checkAndReloadNVData();
260
261 /** @brief function to check and reload volatile channel data
262 *
263 * @return 0 for success, -errno for failure.
264 */
265 int checkAndReloadVolatileData();
266
AppaRao Puli9613ed72018-09-01 23:46:44 +0530267 /** @brief function to sync channel privilege with system network channel
268 * privilege
269 *
270 * @return 0 for success, -errno for failure.
271 */
272 int syncNetworkChannelConfig();
273
274 /** @brief function to set D-Bus property value
275 *
276 * @param[in] bus - bus
277 * @param[in] service - service name
278 * @param[in] objPath - object path
279 * @param[in] interface - interface
280 * @param[in] property - property name
281 * @param[in] value - property value
282 *
283 * @return 0 for success, -errno for failure.
284 */
285 int setDbusProperty(sdbusplus::bus::bus& bus, const std::string& service,
286 const std::string& objPath,
287 const std::string& interface,
288 const std::string& property, const DbusVariant& value);
289
290 /** @brief function to get D-Bus property value
291 *
292 * @param[in] bus - bus
293 * @param[in] service - service name
294 * @param[in] objPath - object path
295 * @param[in] interface - interface
296 * @param[in] property - property name
297 * @param[out] value - property value
298 *
299 * @return 0 for success, -errno for failure.
300 */
301 int getDbusProperty(sdbusplus::bus::bus& bus, const std::string& service,
302 const std::string& objPath,
303 const std::string& interface,
304 const std::string& property, DbusVariant& value);
305
AppaRao Puli071f3f22018-05-24 16:45:30 +0530306 /** @brief function to read json config file
307 *
308 * @param[in] configFile - configuration file name
309 *
310 * @return Json object
311 */
312 Json readJsonFile(const std::string& configFile);
313
314 /** @brief function to write json config file
315 *
316 * @param[in] configFile - configuration file name
317 * @param[in] jsonData - json object
318 *
319 * @return 0 for success, -errno for failure.
320 */
321 int writeJsonFile(const std::string& configFile, const Json& jsonData);
322
323 /** @brief function to convert system access mode to Channel access mode
324 * type
325 *
326 * @param[in] mode - access mode in string
327 *
328 * @return Channel access mode.
329 */
330 EChannelAccessMode convertToAccessModeIndex(const std::string& mode);
331
332 /** @brief function to convert access mode value to string
333 *
334 * @param[in] value - acess mode value
335 *
336 * @return access mode in string
337 */
Richard Marian Thomaiyara45cb342018-12-03 15:08:59 +0530338 std::string convertToAccessModeString(const uint8_t value);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530339
AppaRao Puli071f3f22018-05-24 16:45:30 +0530340 /** @brief function to convert privilege value to string
341 *
342 * @param[in] value - privilege value
343 *
344 * @return privilege in string
345 */
Richard Marian Thomaiyara45cb342018-12-03 15:08:59 +0530346 std::string convertToPrivLimitString(const uint8_t value);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530347
348 /** @brief function to convert session support string to value type
349 *
350 * @param[in] value - session support type in string
351 *
352 * @return support session type
353 */
354 EChannelSessSupported
355 convertToSessionSupportIndex(const std::string& value);
356
357 /** @brief function to convert medium type string to value type
358 *
359 * @param[in] value - medium type in string
360 *
361 * @return channel medium type
362 */
363 EChannelMediumType convertToMediumTypeIndex(const std::string& value);
364
365 /** @brief function to convert protocol type string to value type
366 *
367 * @param[in] value - protocol type in string
368 *
369 * @return channel protocol type
370 */
371 EChannelProtocolType convertToProtocolTypeIndex(const std::string& value);
372
373 /** @brief function to convert channel number to channel index
374 *
375 * @param[in] chNum - channel number
376 *
377 * @return channel index
378 */
Richard Marian Thomaiyara45cb342018-12-03 15:08:59 +0530379 uint8_t convertToChannelIndexNumber(const uint8_t chNum);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530380
381 /** @brief function to convert channel name to network interface name
382 *
383 * @param[in] value - channel interface name - ipmi centric
384 *
385 * @return network channel interface name
386 */
387 std::string convertToNetInterface(const std::string& value);
388};
389
390} // namespace ipmi