blob: d51c0e880ba482d75b4efa844a2e89cb858bcb57 [file] [log] [blame]
Vijay Khemkae7d23d02019-03-08 13:13:40 -08001/*
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
Vijay Khemkae7d23d02019-03-08 13:13:40 -080018#include <sdbusplus/bus.hpp>
19
Vijay Khemka63c99be2020-05-27 19:14:35 -070020#include <iostream>
Jayashree Dhanapal4ec80562022-06-28 15:41:47 +053021#include "config.h"
Vijay Khemka63c99be2020-05-27 19:14:35 -070022
Vijay Khemkae7d23d02019-03-08 13:13:40 -080023static constexpr bool debug = false;
24
Bonnie Lo25b79bf2022-12-16 15:41:48 +080025using IanaType = std::array<uint8_t, 3>;
26
27static constexpr IanaType iana = {0x15, 0xA0, 0x0}; // Meta's IANA
28
Jayashree Dhanapal4ec80562022-06-28 15:41:47 +053029static void instances(std::string s, std::vector<std::string>& host)
30{
31 size_t pos = 0;
32
33 while ((pos = s.find(" ")) != std::string::npos)
34 {
35 host.push_back(s.substr(0, pos));
36 s.erase(0, pos + 1);
37 }
38 host.push_back(s);
39}
40
41inline std::optional<size_t> findHost(size_t id)
42{
43 std::vector<std::string> hosts = {};
44
45 if (hostInstances == "0")
46 {
47 return id;
48 }
49
50 instances(hostInstances, hosts);
51
52 std::sort(hosts.begin(), hosts.end());
53
54 /* ctx host ID for host 1 is 0, host 2 is 1 ... host N is N-1
55 * Therefore, host Index is incremented to 1 to map with the dbus
56 * object path created.
57 */
58 std::string num = std::to_string(id + 1);
59
60 auto instance = std::lower_bound(hosts.begin(), hosts.end(), num);
61
62 if (instance != std::end(hosts))
63 {
64 return id + 1;
65 }
66
67 return std::nullopt;
68}
69
Vijay Khemkae7d23d02019-03-08 13:13:40 -080070inline static void printRegistration(unsigned int netfn, unsigned int cmd)
71{
72 if constexpr (debug)
73 {
74 std::cout << "Registering NetFn:[0x" << std::hex << std::uppercase
75 << netfn << "], Cmd:[0x" << cmd << "]\n";
76 }
77}
78
79inline static void ipmiPrintAndRegister(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
80 ipmi_context_t context,
81 ipmid_callback_t handler,
82 ipmi_cmd_privilege_t priv)
83{
84 printRegistration(netfn, cmd);
85 ipmi_register_callback(netfn, cmd, context, handler, priv);
86}
87
88inline static void printCommand(unsigned int netfn, unsigned int cmd)
89{
90 if constexpr (debug)
91 {
92 std::cout << "Executing NetFn:[0x" << std::hex << std::uppercase
93 << netfn << "], Cmd:[0x" << cmd << "]\n";
94 }
95}
96
97namespace ipmi
98{
Patrick Williamsbec18ea2020-05-13 17:43:23 -050099using DbusVariant = std::variant<std::string, bool, uint8_t, uint16_t, int16_t,
100 uint32_t, int32_t, uint64_t, int64_t, double>;
Vijay Khemkae7d23d02019-03-08 13:13:40 -0800101} // namespace ipmi