1 // Copyright 2021 Google LLC 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 #pragma once 16 17 #include "handler.hpp" 18 19 #include <cstdint> 20 #include <map> 21 #include <nlohmann/json.hpp> 22 #include <string> 23 #include <tuple> 24 #include <vector> 25 26 namespace google 27 { 28 namespace ipmi 29 { 30 31 constexpr char defaultConfigFile[] = 32 "/usr/share/ipmi-entity-association/entity_association_map.json"; 33 34 class Handler : public HandlerInterface 35 { 36 public: 37 explicit Handler(const std::string& entityConfigPath = defaultConfigFile) : 38 _configFile(entityConfigPath){}; 39 ~Handler() = default; 40 41 std::tuple<std::uint8_t, std::string> 42 getEthDetails(std::string intf) const override; 43 std::int64_t getRxPackets(const std::string& name) const override; 44 VersionTuple getCpldVersion(unsigned int id) const override; 45 void psuResetDelay(std::uint32_t delay) const override; 46 void psuResetOnShutdown() const override; 47 std::string getEntityName(std::uint8_t id, std::uint8_t instance) override; 48 uint32_t getFlashSize() override; 49 std::string getMachineName() override; 50 void buildI2cPcieMapping() override; 51 size_t getI2cPcieMappingSize() const override; 52 void hostPowerOffDelay(std::uint32_t delay) const override; 53 std::tuple<std::uint32_t, std::string> 54 getI2cEntry(unsigned int entry) const override; 55 56 private: 57 std::string _configFile; 58 59 bool _entityConfigParsed = false; 60 61 const std::map<uint8_t, std::string> _entityIdToName{ 62 {0x03, "cpu"}, 63 {0x04, "storage_device"}, 64 {0x06, "system_management_module"}, 65 {0x07, "system_board"}, 66 {0x08, "memory_module"}, 67 {0x0B, "add_in_card"}, 68 {0x0E, "power_system_board"}, 69 {0x10, "system_internal_expansion_board"}, 70 {0x11, "other_system_board"}, 71 {0x17, "system_chassis"}, 72 {0x1D, "fan"}, 73 {0x1E, "cooling_unit"}, 74 {0x20, "memory_device"}}; 75 76 nlohmann::json _entityConfig{}; 77 78 std::vector<std::tuple<uint32_t, std::string>> _pcie_i2c_map; 79 }; 80 81 /** 82 * Given a type, entity instance, and a configuration, return the name. 83 * 84 * @param[in] type - the entity type 85 * @param[in] instance - the entity instance 86 * @param[in] config - the json object holding the entity mapping 87 * @return the name of the entity from the map 88 */ 89 std::string readNameFromConfig(const std::string& type, uint8_t instance, 90 const nlohmann::json& config); 91 92 } // namespace ipmi 93 } // namespace google 94