diff options
Diffstat (limited to 'meta-openbmc-mods/meta-common/recipes-phosphor/ipmi')
17 files changed, 1011 insertions, 573 deletions
diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0009-IPv6-Network-changes.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0009-IPv6-Network-changes.patch index 3d9179ce5..b54b22213 100644 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0009-IPv6-Network-changes.patch +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0009-IPv6-Network-changes.patch @@ -1,6 +1,6 @@ -From cd4bc9e4291771f638f66efa205bf8fbec518546 Mon Sep 17 00:00:00 2001 +From c20bc8eb6a08d177d951012eb91b37398b15d81d Mon Sep 17 00:00:00 2001 From: Vernon Mauery <vernon.mauery@linux.intel.com> -Date: Mon, 4 Feb 2019 10:30:12 -0800 +Date: Tue, 27 Nov 2018 11:01:15 -0800 Subject: [PATCH] IPv6 Network changes Allow IPv6 IPMI set/get commands @@ -11,17 +11,62 @@ Signed-off-by: Vernon Mauery <vernon.mauery@linux.intel.com> Change-Id: If5528d3b7294c5f8c17db5919439235d0fad0446 --- - transporthandler.cpp | 667 ++++++++++++++++++++++++++++++++++++++++++- - transporthandler.hpp | 68 +++++ - types.hpp | 9 + - utils.hpp | 1 + - 4 files changed, 744 insertions(+), 1 deletion(-) + include/ipmid/types.hpp | 9 + + include/ipmid/utils.hpp | 1 + + transporthandler.cpp | 654 +++++++++++++++++++++++++++++++++++++++- + transporthandler.hpp | 50 +++ + 4 files changed, 713 insertions(+), 1 deletion(-) -Index: phosphor-host-ipmid.clean/transporthandler.cpp -=================================================================== ---- phosphor-host-ipmid.clean.orig/transporthandler.cpp -+++ phosphor-host-ipmid.clean/transporthandler.cpp -@@ -41,6 +41,12 @@ extern std::unique_ptr<phosphor::Timer> +diff --git a/include/ipmid/types.hpp b/include/ipmid/types.hpp +index 57c5873..c06fd8c 100644 +--- a/include/ipmid/types.hpp ++++ b/include/ipmid/types.hpp +@@ -224,6 +224,7 @@ constexpr auto ADDR_TYPE_FORMAT = "%hhx"; + + constexpr auto IPV4_ADDRESS_SIZE_BYTE = 4; + constexpr auto IPV6_ADDRESS_SIZE_BYTE = 16; ++constexpr auto IPV6_ADDRESS_STATUS_SIZE = 22; + + constexpr auto DEFAULT_MAC_ADDRESS = "00:00:00:00:00:00"; + constexpr auto DEFAULT_ADDRESS = "0.0.0.0"; +@@ -235,6 +236,7 @@ constexpr auto BITS_32 = 32; + constexpr auto MASK_32_BIT = 0xFFFFFFFF; + constexpr auto VLAN_ID_MASK = 0x00000FFF; + constexpr auto VLAN_ENABLE_MASK = 0x8000; ++constexpr auto IPV6_DUID_SIZE = 18; + + enum class IPOrigin : uint8_t + { +@@ -243,5 +245,12 @@ enum class IPOrigin : uint8_t + DHCP = 2, + }; + ++enum class AddressingEnables : uint8_t ++{ ++ IPv4Only = 0, ++ IPv6Only = 1, ++ IPv4AndIPv6 = 2, ++}; ++ + } // namespace network + } // namespace ipmi +diff --git a/include/ipmid/utils.hpp b/include/ipmid/utils.hpp +index 9ef1488..8b91b12 100644 +--- a/include/ipmid/utils.hpp ++++ b/include/ipmid/utils.hpp +@@ -256,6 +256,7 @@ namespace network + constexpr auto ROOT = "/xyz/openbmc_project/network"; + constexpr auto SERVICE = "xyz.openbmc_project.Network"; + constexpr auto IP_TYPE = "ipv4"; ++constexpr auto IPV6_TYPE = "ipv6"; + constexpr auto IPV4_PREFIX = "169.254"; + constexpr auto IPV6_PREFIX = "fe80"; + constexpr auto IP_INTERFACE = "xyz.openbmc_project.Network.IP"; +diff --git a/transporthandler.cpp b/transporthandler.cpp +index 8172cc4..12d224a 100644 +--- a/transporthandler.cpp ++++ b/transporthandler.cpp +@@ -30,6 +30,12 @@ std::unique_ptr<phosphor::Timer> networkTimer = nullptr; const int SIZE_MAC = 18; // xx:xx:xx:xx:xx:xx constexpr auto ipv4Protocol = "xyz.openbmc_project.Network.IP.Protocol.IPv4"; @@ -34,7 +79,7 @@ Index: phosphor-host-ipmid.clean/transporthandler.cpp std::map<int, std::unique_ptr<struct ChannelConfig_t>> channelConfig; -@@ -400,7 +406,6 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_n +@@ -389,7 +395,6 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_netfn_t netfn, ipmi_cmd_t cmd, ipmi_context_t context) { ipmi_ret_t rc = IPMI_CC_OK; @@ -42,7 +87,7 @@ Index: phosphor-host-ipmid.clean/transporthandler.cpp using namespace std::chrono_literals; -@@ -414,6 +419,9 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_n +@@ -403,6 +408,9 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_netfn_t netfn, ipmi_cmd_t cmd, auto reqptr = reinterpret_cast<const set_lan_t*>(request); sdbusplus::bus::bus bus(ipmid_get_sd_bus_connection()); @@ -51,8 +96,8 @@ Index: phosphor-host-ipmid.clean/transporthandler.cpp + // channel number is the lower nibble int channel = reqptr->channel & CHANNEL_MASK; - auto ethdevice = ipmi::network::ChanneltoEthernet(channel); -@@ -437,6 +445,11 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_n + auto ethdevice = ipmi::getChannelName(channel); +@@ -426,6 +434,11 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_netfn_t netfn, ipmi_cmd_t cmd, case LanParam::IPSRC: { @@ -64,7 +109,7 @@ Index: phosphor-host-ipmid.clean/transporthandler.cpp uint8_t ipsrc{}; std::memcpy(&ipsrc, reqptr->data, ipmi::network::IPSRC_SIZE_BYTE); channelConf->ipsrc = static_cast<ipmi::network::IPOrigin>(ipsrc); -@@ -445,6 +458,11 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_n +@@ -434,6 +447,11 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_netfn_t netfn, ipmi_cmd_t cmd, case LanParam::MAC: { @@ -76,7 +121,7 @@ Index: phosphor-host-ipmid.clean/transporthandler.cpp char mac[SIZE_MAC]; std::snprintf(mac, SIZE_MAC, ipmi::network::MAC_ADDRESS_FORMAT, -@@ -465,6 +483,11 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_n +@@ -454,6 +472,11 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_netfn_t netfn, ipmi_cmd_t cmd, case LanParam::SUBNET: { @@ -88,7 +133,7 @@ Index: phosphor-host-ipmid.clean/transporthandler.cpp std::snprintf(netmask, INET_ADDRSTRLEN, ipmi::network::IP_ADDRESS_FORMAT, reqptr->data[0], reqptr->data[1], reqptr->data[2], reqptr->data[3]); -@@ -474,6 +497,11 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_n +@@ -463,6 +486,11 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_netfn_t netfn, ipmi_cmd_t cmd, case LanParam::GATEWAY: { @@ -100,7 +145,7 @@ Index: phosphor-host-ipmid.clean/transporthandler.cpp std::snprintf(gateway, INET_ADDRSTRLEN, ipmi::network::IP_ADDRESS_FORMAT, reqptr->data[0], reqptr->data[1], reqptr->data[2], reqptr->data[3]); -@@ -483,6 +511,11 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_n +@@ -472,6 +500,11 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_netfn_t netfn, ipmi_cmd_t cmd, case LanParam::VLAN: { @@ -112,7 +157,7 @@ Index: phosphor-host-ipmid.clean/transporthandler.cpp uint16_t vlan{}; std::memcpy(&vlan, reqptr->data, ipmi::network::VLAN_SIZE_BYTE); // We are not storing the enable bit -@@ -495,6 +528,11 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_n +@@ -484,6 +517,11 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_netfn_t netfn, ipmi_cmd_t cmd, case LanParam::INPROGRESS: { @@ -124,7 +169,7 @@ Index: phosphor-host-ipmid.clean/transporthandler.cpp if (reqptr->data[0] == SET_COMPLETE) { channelConf->lan_set_in_progress = SET_COMPLETE; -@@ -523,6 +561,122 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_n +@@ -512,6 +550,122 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_netfn_t netfn, ipmi_cmd_t cmd, } break; @@ -247,7 +292,7 @@ Index: phosphor-host-ipmid.clean/transporthandler.cpp default: { rc = IPMI_CC_PARM_NOT_SUPPORTED; -@@ -549,6 +703,7 @@ ipmi_ret_t ipmi_transport_get_lan(ipmi_n +@@ -538,6 +692,7 @@ ipmi_ret_t ipmi_transport_get_lan(ipmi_netfn_t netfn, ipmi_cmd_t cmd, ipmi_ret_t rc = IPMI_CC_OK; *data_len = 0; const uint8_t current_revision = 0x11; // Current rev per IPMI Spec 2.0 @@ -255,7 +300,7 @@ Index: phosphor-host-ipmid.clean/transporthandler.cpp get_lan_t* reqptr = (get_lan_t*)request; // channel number is the lower nibble -@@ -687,6 +842,489 @@ ipmi_ret_t ipmi_transport_get_lan(ipmi_n +@@ -676,6 +831,476 @@ ipmi_ret_t ipmi_transport_get_lan(ipmi_netfn_t netfn, ipmi_cmd_t cmd, static_cast<uint8_t>(cipherList.size()); break; } @@ -327,12 +372,10 @@ Index: phosphor-host-ipmid.clean/transporthandler.cpp + networkInterfacePath = networkInterfaceObject.first; + } + -+ std::string ipEnables = -+ sdbusplus::message::variant_ns::get<std::string>( -+ ipmi::getDbusProperty(bus, ipmi::network::SERVICE, -+ networkInterfacePath, -+ ipmi::network::ETHERNET_INTERFACE, -+ "IPAddressEnables")); ++ ipmi::Value ipEnablesProp = ipmi::getDbusProperty( ++ bus, ipmi::network::SERVICE, networkInterfacePath, ++ ipmi::network::ETHERNET_INTERFACE, "IPAddressEnables"); ++ std::string ipEnables = std::get<std::string>(ipEnablesProp); + + // check if on off ipv4 ipv6, etc. + bool found = false; @@ -392,20 +435,14 @@ Index: phosphor-host-ipmid.clean/transporthandler.cpp + bus, ipObjectInfo.second, ipObjectInfo.first, + ipmi::network::IP_INTERFACE); + -+ std::string origin = -+ sdbusplus::message::variant_ns::get<std::string>( -+ properties["Origin"]); -+ if (sdbusplus::message::variant_ns::get<std::string>( -+ properties["Origin"]) == ++ if (std::get<std::string>(properties["Origin"]) == + "xyz.openbmc_project.Network.IP.AddressOrigin.Static") + { + ipaddress = -+ sdbusplus::message::variant_ns::get<std::string>( -+ properties["Address"]); ++ std::get<std::string>(properties["Address"]); + ipv6AddressSource = 0x81; // Looking at bit 0 and bit 7 + prefixLength = -+ sdbusplus::message::variant_ns::get<uint8_t>( -+ properties["PrefixLength"]); ++ std::get<uint8_t>(properties["PrefixLength"]); + status = 0; + } + } @@ -458,8 +495,7 @@ Index: phosphor-host-ipmid.clean/transporthandler.cpp + bus, macObjectInfo.second, macObjectInfo.first, + ipmi::network::MAC_INTERFACE, "MACAddress"); + -+ macAddress = -+ sdbusplus::message::variant_ns::get<std::string>(variant); ++ macAddress = std::get<std::string>(variant); + } + else if (channelConf->lan_set_in_progress == SET_IN_PROGRESS) + { @@ -505,17 +541,14 @@ Index: phosphor-host-ipmid.clean/transporthandler.cpp + bus, ipObjectInfo.second, ipObjectInfo.first, + ipmi::network::IP_INTERFACE); + -+ if (sdbusplus::message::variant_ns::get<std::string>( -+ properties["Origin"]) == ++ if (std::get<std::string>(properties["Origin"]) == + "xyz.openbmc_project.Network.IP.AddressOrigin.DHCP") + { + ipaddress = -+ sdbusplus::message::variant_ns::get<std::string>( -+ properties["Address"]); ++ std::get<std::string>(properties["Address"]); + ipv6AddressSource = 0x81; // Looking at bit 0 and bit 7 + prefixLength = -+ sdbusplus::message::variant_ns::get<uint8_t>( -+ properties["PrefixLength"]); ++ std::get<uint8_t>(properties["PrefixLength"]); + status = 0; + } + else @@ -574,8 +607,7 @@ Index: phosphor-host-ipmid.clean/transporthandler.cpp + bus, macObjectInfo.second, macObjectInfo.first, + ipmi::network::MAC_INTERFACE, "MACAddress"); + -+ macAddress = -+ sdbusplus::message::variant_ns::get<std::string>(variant); ++ macAddress = std::get<std::string>(variant); + } + else if (channelConf->lan_set_in_progress == SET_IN_PROGRESS) + { @@ -661,7 +693,7 @@ Index: phosphor-host-ipmid.clean/transporthandler.cpp + auto variant = ipmi::getDbusProperty( + bus, ipmi::network::SERVICE, networkInterfacePath, + ipmi::network::ETHERNET_INTERFACE, "IPv6AcceptRA"); -+ dynamicRA = sdbusplus::message::variant_ns::get<bool>(variant); ++ dynamicRA = std::get<bool>(variant); + } + else + { @@ -745,7 +777,7 @@ Index: phosphor-host-ipmid.clean/transporthandler.cpp default: log<level::ERR>("Unsupported parameter", entry("PARAMETER=0x%x", reqptr->parameter)); -@@ -932,6 +1570,16 @@ void applyChanges(int channel) +@@ -921,6 +1546,16 @@ void applyChanges(int channel) ipaddress, prefix); } @@ -762,7 +794,7 @@ Index: phosphor-host-ipmid.clean/transporthandler.cpp if (!gateway.empty()) { ipmi::setDbusProperty(bus, systemObject.second, -@@ -939,7 +1587,24 @@ void applyChanges(int channel) +@@ -928,7 +1563,24 @@ void applyChanges(int channel) ipmi::network::SYSTEMCONFIG_INTERFACE, "DefaultGateway", std::string(gateway)); } @@ -787,11 +819,11 @@ Index: phosphor-host-ipmid.clean/transporthandler.cpp } catch (InternalFailure& e) { -Index: phosphor-host-ipmid.clean/transporthandler.hpp -=================================================================== ---- phosphor-host-ipmid.clean.orig/transporthandler.hpp -+++ phosphor-host-ipmid.clean/transporthandler.hpp -@@ -80,6 +80,28 @@ enum class LanParam : uint8_t +diff --git a/transporthandler.hpp b/transporthandler.hpp +index 04d4673..bd23391 100644 +--- a/transporthandler.hpp ++++ b/transporthandler.hpp +@@ -79,6 +79,28 @@ enum class LanParam : uint8_t IPV6_NEIGHBOR_TIMING_CONFIGURATION = 80, }; @@ -820,7 +852,7 @@ Index: phosphor-host-ipmid.clean/transporthandler.hpp constexpr uint8_t SET_COMPLETE = 0; constexpr uint8_t SET_IN_PROGRESS = 1; constexpr uint8_t SET_COMMIT_WRITE = 2; // Optional -@@ -102,6 +124,20 @@ struct ChannelConfig_t +@@ -101,6 +123,20 @@ struct ChannelConfig_t uint8_t lan_set_in_progress = SET_COMPLETE; bool flush = false; @@ -841,7 +873,7 @@ Index: phosphor-host-ipmid.clean/transporthandler.hpp void clear() { ipaddr.clear(); -@@ -112,6 +148,20 @@ struct ChannelConfig_t +@@ -111,6 +147,20 @@ struct ChannelConfig_t ipsrc = ipmi::network::IPOrigin::UNSPECIFIED; lan_set_in_progress = SET_COMPLETE; flush = false; @@ -862,48 +894,6 @@ Index: phosphor-host-ipmid.clean/transporthandler.hpp } }; -Index: phosphor-host-ipmid.clean/types.hpp -=================================================================== ---- phosphor-host-ipmid.clean.orig/types.hpp -+++ phosphor-host-ipmid.clean/types.hpp -@@ -209,6 +209,7 @@ constexpr auto ADDR_TYPE_FORMAT = "%hhx" - - constexpr auto IPV4_ADDRESS_SIZE_BYTE = 4; - constexpr auto IPV6_ADDRESS_SIZE_BYTE = 16; -+constexpr auto IPV6_ADDRESS_STATUS_SIZE = 22; - - constexpr auto DEFAULT_MAC_ADDRESS = "00:00:00:00:00:00"; - constexpr auto DEFAULT_ADDRESS = "0.0.0.0"; -@@ -220,6 +221,7 @@ constexpr auto BITS_32 = 32; - constexpr auto MASK_32_BIT = 0xFFFFFFFF; - constexpr auto VLAN_ID_MASK = 0x00000FFF; - constexpr auto VLAN_ENABLE_MASK = 0x8000; -+constexpr auto IPV6_DUID_SIZE = 18; - - enum class IPOrigin : uint8_t - { -@@ -228,5 +230,12 @@ enum class IPOrigin : uint8_t - DHCP = 2, - }; - -+enum class AddressingEnables : uint8_t -+{ -+ IPv4Only = 0, -+ IPv6Only = 1, -+ IPv4AndIPv6 = 2, -+}; -+ - } // namespace network - } // namespace ipmi -Index: phosphor-host-ipmid.clean/utils.hpp -=================================================================== ---- phosphor-host-ipmid.clean.orig/utils.hpp -+++ phosphor-host-ipmid.clean/utils.hpp -@@ -246,6 +246,7 @@ namespace network - constexpr auto ROOT = "/xyz/openbmc_project/network"; - constexpr auto SERVICE = "xyz.openbmc_project.Network"; - constexpr auto IP_TYPE = "ipv4"; -+constexpr auto IPV6_TYPE = "ipv6"; - constexpr auto IPV4_PREFIX = "169.254"; - constexpr auto IPV6_PREFIX = "fe80"; - constexpr auto IP_INTERFACE = "xyz.openbmc_project.Network.IP"; +-- +2.17.1 + diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0016-add-better-sdbusplus-exception-handling.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0016-add-better-sdbusplus-exception-handling.patch deleted file mode 100644 index 873eb6b16..000000000 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0016-add-better-sdbusplus-exception-handling.patch +++ /dev/null @@ -1,153 +0,0 @@ -From a445f287d4aebca68dc0321e292933311caf59ba Mon Sep 17 00:00:00 2001 -From: Yong Li <yong.b.li@linux.intel.com> -Date: Sun, 16 Sep 2018 20:14:55 +0800 -Subject: [PATCH] add better sdbusplus exception handling - -Now that sdbusplus throws, we need to catch more stuff. To compound the -problem, even though sdbusplus::exception::exception inherits from -std::exception, there is a problem that prevents the code from simply -catching std::exception. - -Change-Id: I2a330e542f5d87722a4c04e6d47de2cfb2f7d7c9 -Signed-off-by: Vernon Mauery <vernon.mauery@intel.com> -Signed-off-by: Yong Li <yong.b.li@linux.intel.com> - ---- - apphandler.cpp | 14 +++++++-- - ipmid.cpp | 77 +++++++++++++++++++++++++++++++++++--------------- - 2 files changed, 66 insertions(+), 25 deletions(-) - -diff --git a/apphandler.cpp b/apphandler.cpp -index 126de33..3cae6d5 100644 ---- a/apphandler.cpp -+++ b/apphandler.cpp -@@ -312,9 +312,19 @@ ipmi_ret_t ipmi_app_get_device_id(ipmi_netfn_t netfn, ipmi_cmd_t cmd, - auto version = getActiveSoftwareVersionInfo(); - r = convert_version(version.c_str(), &rev); - } -- catch (const std::exception& e) -+ catch (sdbusplus::exception::exception& e) - { -- log<level::ERR>(e.what()); -+ log<level::ERR>("sdbusplus::exception", -+ entry("ERROR=%s", e.what())); -+ } -+ catch (std::exception& e) -+ { -+ log<level::ERR>("unexpected exception", -+ entry("ERROR=%s", e.what())); -+ } -+ catch (...) -+ { -+ log<level::ERR>("unknown exception"); - } - - if (r >= 0) -diff --git a/ipmid.cpp b/ipmid.cpp -index 2d48bfe..8d2fb37 100644 ---- a/ipmid.cpp -+++ b/ipmid.cpp -@@ -273,6 +273,10 @@ ipmi_ret_t ipmi_netfn_router(ipmi_netfn_t netfn, ipmi_cmd_t cmd, - } - // IPMI command handlers can throw unhandled exceptions, catch those - // and return sane error code. -+ catch (sdbusplus::exception::exception& e) -+ { -+ log<level::ERR>("sdbusplus exception", entry("EXCEPTION=%s", e.what())); -+ } - catch (const std::exception& e) - { - log<level::ERR>(e.what(), entry("NET_FUN=0x%X", netfn), -@@ -281,6 +285,23 @@ ipmi_ret_t ipmi_netfn_router(ipmi_netfn_t netfn, ipmi_cmd_t cmd, - *data_len = 0; - // fall through - } -+ catch (...) -+ { -+ std::exception_ptr eptr = std::current_exception(); -+ try -+ { -+ std::rethrow_exception(eptr); -+ } -+ catch (std::exception& e) -+ { -+ log<level::ERR>("unexpected uncaught exception", -+ entry("EXCEPTION=%s", e.what()), -+ entry("NET_FUN=0x%X", netfn), -+ entry("CMD=0x%X", cmd)); -+ rc = IPMI_CC_UNSPECIFIED_ERROR; -+ *data_len = 0; -+ } -+ } - // Now copy the return code that we got from handler and pack it in first - // byte. - std::memcpy(response, &rc, IPMI_CC_LEN); -@@ -361,32 +382,42 @@ final: - void cache_restricted_mode() - { - restricted_mode = false; -- using namespace sdbusplus::xyz::openbmc_project::Control::Security::server; -- using namespace internal; -- using namespace internal::cache; -- sdbusplus::bus::bus dbus(ipmid_get_sd_bus_connection()); -- const auto& restrictionModeSetting = -- objects->map.at(restrictionModeIntf).front(); -- auto method = dbus.new_method_call( -- objects->service(restrictionModeSetting, restrictionModeIntf).c_str(), -- restrictionModeSetting.c_str(), "org.freedesktop.DBus.Properties", -- "Get"); -- method.append(restrictionModeIntf, "RestrictionMode"); -- auto resp = dbus.call(method); -- if (resp.is_method_error()) -+ try - { -- log<level::ERR>("Error in RestrictionMode Get"); -- // Fail-safe to true. -- restricted_mode = true; -- return; -+ using namespace sdbusplus::xyz::openbmc_project::Control::Security:: -+ server; -+ using namespace internal; -+ using namespace internal::cache; -+ sdbusplus::bus::bus dbus(ipmid_get_sd_bus_connection()); -+ const auto& restrictionModeSetting = -+ objects->map.at(restrictionModeIntf).front(); -+ auto method = dbus.new_method_call( -+ objects->service(restrictionModeSetting, restrictionModeIntf) -+ .c_str(), -+ restrictionModeSetting.c_str(), "org.freedesktop.DBus.Properties", -+ "Get"); -+ method.append(restrictionModeIntf, "RestrictionMode"); -+ auto resp = dbus.call(method); -+ if (resp.is_method_error()) -+ { -+ log<level::ERR>("Error in RestrictionMode Get"); -+ // Fail-safe to true. -+ restricted_mode = true; -+ return; -+ } -+ sdbusplus::message::variant<std::string> result; -+ resp.read(result); -+ auto restrictionMode = RestrictionMode::convertModesFromString( -+ sdbusplus::message::variant_ns::get<std::string>(result)); -+ if (RestrictionMode::Modes::Whitelist == restrictionMode) -+ { -+ restricted_mode = true; -+ } - } -- sdbusplus::message::variant<std::string> result; -- resp.read(result); -- auto restrictionMode = RestrictionMode::convertModesFromString( -- variant_ns::get<std::string>(result)); -- if (RestrictionMode::Modes::Whitelist == restrictionMode) -+ catch (sdbusplus::exception::exception& e) - { -- restricted_mode = true; -+ // restrictionModeIntf does not exist; default to not enforcing -+ log<level::ERR>("sdbusplus exception", entry("EXCEPTION=%s", e.what())); - } - } - --- -2.17.1 - diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0018-Catch-sdbusplus-exceptions-in-IPMI-net.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0018-Catch-sdbusplus-exceptions-in-IPMI-net.patch deleted file mode 100644 index 6fa69b602..000000000 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0018-Catch-sdbusplus-exceptions-in-IPMI-net.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 4490ee7a9fd054640af7a9da3400f76195dc2880 Mon Sep 17 00:00:00 2001 -From: Yong Li <yong.b.li@linux.intel.com> -Date: Sun, 16 Sep 2018 21:03:58 +0800 -Subject: [PATCH] Catch sdbusplus exceptions in IPMI net - -Missing the correct exception was causing issues with setting the IPV4 -address - -Change-Id: Ieaaacfcbaec82a0c3b110889817a7ceb9cda8d3c -Signed-off-by: Dave Cobbley <david.j.cobbley@linux.intel.com> -Signed-off-by: Yong Li <yong.b.li@linux.intel.com> ---- - transporthandler.cpp | 2 +- - utils.cpp | 5 +++-- - 2 files changed, 4 insertions(+), 3 deletions(-) - -diff --git a/transporthandler.cpp b/transporthandler.cpp -index 6f4ec3f..6cb3feb 100644 ---- a/transporthandler.cpp -+++ b/transporthandler.cpp -@@ -1559,7 +1559,7 @@ void applyChanges(int channel) - ipmi::network::ETHERNET_INTERFACE, "IPv6AcceptRA", - (bool)channelConf->ipv6RouterAddressConfigControl); - } -- catch (InternalFailure& e) -+ catch (sdbusplus::exception::exception& e) - { - log<level::ERR>( - "Failed to set network data", entry("PREFIX=%d", prefix), -diff --git a/utils.cpp b/utils.cpp -index 225b1cc..d10b5de 100644 ---- a/utils.cpp -+++ b/utils.cpp -@@ -358,9 +358,10 @@ void deleteAllDbusObjects(sdbusplus::bus::bus& bus, - "Delete"); - } - } -- catch (InternalFailure& e) -+ catch (sdbusplus::exception::exception& e) - { -- log<level::INFO>("Unable to delete the objects having", -+ log<level::INFO>("sdbusplus exception - Unable to delete the objects", -+ entry("ERROR=%s", e.what()), - entry("INTERFACE=%s", interface.c_str()), - entry("SERVICE=%s", serviceRoot.c_str())); - } --- -2.7.4 - diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0048-Implement-IPMI-Master-Write-Read-command.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0048-Implement-IPMI-Master-Write-Read-command.patch index 4018dbffe..542c4f667 100644 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0048-Implement-IPMI-Master-Write-Read-command.patch +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0048-Implement-IPMI-Master-Write-Read-command.patch @@ -1,4 +1,4 @@ -From cd25f43461b41b74d19cd1f93ce301df9c3bd4f2 Mon Sep 17 00:00:00 2001 +From a8d7429b7bd9dea33d59c6e83f17372e77fe6145 Mon Sep 17 00:00:00 2001 From: Yong Li <yong.b.li@linux.intel.com> Date: Fri, 21 Sep 2018 09:21:14 +0800 Subject: [PATCH] Implement IPMI Master Write-Read command @@ -11,31 +11,36 @@ that provide an SMBus slave interface. Signed-off-by: Yong Li <yong.b.li@linux.intel.com> --- - apphandler.cpp | 236 ++++++++++++++++++++++++++++++++++++++++++++++ + apphandler.cpp | 276 +++++++++++++++++++++++++++++++++++++- apphandler.hpp | 1 + host-ipmid-whitelist.conf | 1 + - 3 files changed, 238 insertions(+) + 3 files changed, 274 insertions(+), 4 deletions(-) diff --git a/apphandler.cpp b/apphandler.cpp -index 17aff2a..2fe79f6 100644 +index 15965ca..d8fb23d 100644 --- a/apphandler.cpp +++ b/apphandler.cpp -@@ -8,6 +8,14 @@ - #include "types.hpp" - #include "utils.hpp" - +@@ -1,6 +1,19 @@ ++#include "apphandler.hpp" ++ ++#include "app/watchdog.hpp" ++#include "sys_info_param.hpp" ++#include "transporthandler.hpp" ++ + #include <arpa/inet.h> +#include <fcntl.h> ++#include <ipmid/api.h> + #include <limits.h> +#include <linux/i2c-dev.h> +#include <linux/i2c.h> + #include <mapper.h> +#include <sys/ioctl.h> +#include <sys/stat.h> +#include <sys/types.h> -+#include <unistd.h> -+ - #include <arpa/inet.h> - #include <host-ipmid/ipmid-api.h> - #include <limits.h> -@@ -55,6 +63,8 @@ constexpr auto bmc_guid_interface = "xyz.openbmc_project.Common.UUID"; + #include <systemd/sd-bus.h> + #include <unistd.h> + +@@ -41,6 +54,8 @@ constexpr auto bmc_guid_interface = "xyz.openbmc_project.Common.UUID"; constexpr auto bmc_guid_property = "UUID"; constexpr auto bmc_guid_len = 16; @@ -44,10 +49,23 @@ index 17aff2a..2fe79f6 100644 static constexpr auto redundancyIntf = "xyz.openbmc_project.Software.RedundancyPriority"; static constexpr auto versionIntf = "xyz.openbmc_project.Software.Version"; -@@ -86,6 +96,34 @@ typedef struct - uint8_t aux[4]; - } __attribute__((packed)) ipmi_device_id_t; +@@ -59,6 +74,47 @@ using BMC = sdbusplus::xyz::openbmc_project::State::server::BMC; + namespace fs = std::filesystem; + namespace variant_ns = sdbusplus::message::variant_ns; ++// Offset in get device id command. ++typedef struct ++{ ++ uint8_t id; ++ uint8_t revision; ++ uint8_t fw[2]; ++ uint8_t ipmi_ver; ++ uint8_t addn_dev_support; ++ uint8_t manuf_id[3]; ++ uint8_t prod_id[2]; ++ uint8_t aux[4]; ++} __attribute__((packed)) ipmi_device_id_t; ++ +typedef struct +{ + uint8_t busId; @@ -79,7 +97,7 @@ index 17aff2a..2fe79f6 100644 /** * @brief Returns the Version info from primary s/w object * -@@ -1089,8 +1127,195 @@ writeResponse: +@@ -1022,6 +1078,192 @@ writeResponse: return IPMI_CC_OK; } @@ -199,7 +217,8 @@ index 17aff2a..2fe79f6 100644 + reqptr += sizeof(ipmiI2cRwReq); + std::copy(reqptr, reqptr + writeCount, outBuf.begin()); + -+ log<level::DEBUG>("checking list ", entry("SIZE=%d", getWhiteList().size())); ++ log<level::DEBUG>("checking list ", ++ entry("SIZE=%d", getWhiteList().size())); + // command whitelist checking + for (unsigned int i = 0; i < getWhiteList().size(); i++) + { @@ -270,16 +289,26 @@ index 17aff2a..2fe79f6 100644 + void register_netfn_app_functions() { -+ int ret = -1; -+ - // <Get BT Interface Capabilities> - ipmi_register_callback(NETFUN_APP, IPMI_CMD_GET_CAP_BIT, NULL, - ipmi_app_get_bt_capabilities, PRIVILEGE_USER); -@@ -1145,6 +1370,17 @@ void register_netfn_app_functions() - ipmi_app_channel_info, PRIVILEGE_USER); - #endif + // <Get Device ID> +@@ -1063,6 +1306,31 @@ void register_netfn_app_functions() + ipmi_register_callback(NETFUN_APP, IPMI_CMD_GET_ACPI, NULL, + ipmi_app_get_acpi_power_state, PRIVILEGE_ADMIN); -+ ret = loadI2CWhiteList(); ++// TODO: Below code and associated api's need to be removed later. ++// Its commented for now to avoid merge conflicts with upstream ++// changes and smooth upstream upgrades. ++#if 0 ++>>>>>>> IPMI Channel commands implementation ++ // <Get Channel Access> ++ ipmi_register_callback(NETFUN_APP, IPMI_CMD_GET_CHANNEL_ACCESS, NULL, ++ ipmi_get_channel_access, PRIVILEGE_USER); ++ ++ // <Get Channel Info Command> ++ ipmi_register_callback(NETFUN_APP, IPMI_CMD_GET_CHAN_INFO, NULL, ++ ipmi_app_channel_info, PRIVILEGE_USER); ++#endif ++ ++ int ret = loadI2CWhiteList(); + log<level::DEBUG>("i2c white list is loaded", entry("RET=%d", ret), + entry("SIZE=%d", getWhiteList().size())); + if (ret == 0) @@ -306,17 +335,17 @@ index d4dd8e8..f9e5c59 100644 IPMI_CMD_SET_SYSTEM_INFO = 0x58, IPMI_CMD_GET_SYSTEM_INFO = 0x59, diff --git a/host-ipmid-whitelist.conf b/host-ipmid-whitelist.conf -index c7eb2d8..22a2a3c 100644 +index 49ff7b0..1ae79fd 100644 --- a/host-ipmid-whitelist.conf +++ b/host-ipmid-whitelist.conf -@@ -25,6 +25,7 @@ - 0x06:0x36 //<App>:<Get BT Interface Capabilities> +@@ -27,6 +27,7 @@ 0x06:0x37 //<App>:<Get System GUID> 0x06:0x42 //<App>:<Get Channel Info Command> + 0x06:0x4E //<App>:<Get Channel Payload Support> +0x06:0x52 //<App>:<Master Write Read Command> 0x06:0x54 //<App>:<Get Channel Cipher Suites> 0x0A:0x10 //<Storage>:<Get FRU Inventory Area Info> 0x0A:0x11 //<Storage>:<Read FRU Data> -- -2.7.4 +2.17.1 diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0051-Fix-Set-LAN-Config-to-work-without-SetInProgress.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0051-Fix-Set-LAN-Config-to-work-without-SetInProgress.patch deleted file mode 100644 index 3990c6b5c..000000000 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0051-Fix-Set-LAN-Config-to-work-without-SetInProgress.patch +++ /dev/null @@ -1,142 +0,0 @@ -From cae9e21f88e6f12c80c89402473a17a10258c843 Mon Sep 17 00:00:00 2001 -From: Richard Marian Thomaiyar <richard.marian.thomaiyar@linux.intel.com> -Date: Thu, 17 Jan 2019 21:22:30 +0530 -Subject: [PATCH] Fix: Set LAN Config to work without SetInProgress - -Set LAN Configuration parameters in up-stream code works -with SetInProgress (parameter selector 0), to be marked -as SET_IN_PROGRESS before fields update, and SET_COMPLETE to -make the changes effective. This is not mandatory as per -IPMI Spec, and we must support individual fields update. -Fix: -1. After SET_COMPLETE for parameter selector, changes has -to be applied immediately, and doesn't require to rely on -network timer, as purpose of this logic itself is to stage -and commit. -2. Allow individual parameter changes to take effect based -on timer. For the time being reduced the timer to 5 sec -to have quicker turn-around and group things together. - -TODO: -Still need to introduce lock between ChannelConfig variable -between Timer & Get / Set LAN Configuration command to avoid -race condition - -Unit-Test: -1. Verified the BIOS Setup page, able to set the IPV4 to static -IP, afte disabling IPV6, and configuring IPV4 to static, after -save and reset, the changes of IPV4 static is preserved. - -Change-Id: I7c2edad2861b5dba5ad1ca97cc5e39ac02871746 -Signed-off-by: Richard Marian Thomaiyar <richard.marian.thomaiyar@linux.intel.com> ---- - transporthandler.cpp | 54 ++++++++++++++++++++++++++++++++++++---------------- - transporthandler.hpp | 2 ++ - 2 files changed, 40 insertions(+), 16 deletions(-) - -Index: phosphor-host-ipmid.clean/transporthandler.cpp -=================================================================== ---- phosphor-host-ipmid.clean.orig/transporthandler.cpp -+++ phosphor-host-ipmid.clean/transporthandler.cpp -@@ -399,6 +399,41 @@ struct set_lan_t - uint8_t data[8]; // Per IPMI spec, not expecting more than this size - } __attribute__((packed)); - -+ipmi_ret_t checkAndUpdateNetwork(int channel) -+{ -+ auto channelConf = getChannelConfig(channel); -+ using namespace std::chrono_literals; -+ // time to wait before applying the network changes. -+ constexpr auto networkTimeout = 5000000us; // 5 sec -+ -+ if (channelConf->lan_set_in_progress == SET_COMPLETE && -+ ((channelConf->flush == false) || -+ (channelConf->updateInProgress == true))) -+ { -+ channelConf->flush = true; -+ // used to indicate that network timer update is in progress. -+ channelConf->updateInProgress = true; -+ if (!networkTimer) -+ { -+ log<level::ERR>("Network timer is not instantiated"); -+ return IPMI_CC_UNSPECIFIED_ERROR; -+ } -+ // start/restart the timer -+ // TODO: Need to implement locking mechansim between networkTimer & -+ // get/set to avoid race condition. -+ networkTimer->start(networkTimeout); -+ } -+ else if (channelConf->lan_set_in_progress == SET_COMPLETE && -+ channelConf->flush == true && -+ channelConf->updateInProgress == false) -+ { -+ // Apply the network changes immediately, if proper SET_IN_PROGRESS, -+ // followed by SET_COMPLETE is issued. -+ applyChanges(channel); -+ } -+ return IPMI_CC_OK; -+} -+ - ipmi_ret_t ipmi_transport_set_lan(ipmi_netfn_t netfn, ipmi_cmd_t cmd, - ipmi_request_t request, - ipmi_response_t response, -@@ -406,12 +441,6 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_n - ipmi_context_t context) - { - ipmi_ret_t rc = IPMI_CC_OK; -- -- using namespace std::chrono_literals; -- -- // time to wait before applying the network changes. -- constexpr auto networkTimeout = 10000000us; // 10 sec -- - char ipaddr[INET_ADDRSTRLEN]; - char netmask[INET_ADDRSTRLEN]; - char gateway[INET_ADDRSTRLEN]; -@@ -543,15 +572,6 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_n - entry("ADDRESS=%s", channelConf->ipaddr.c_str()), - entry("GATEWAY=%s", channelConf->gateway.c_str()), - entry("VLAN=%d", channelConf->vlanID)); -- -- if (!networkTimer) -- { -- log<level::ERR>("Network timer is not instantiated"); -- return IPMI_CC_UNSPECIFIED_ERROR; -- } -- -- // start/restart the timer -- networkTimer->start(networkTimeout); - } - else if (reqptr->data[0] == SET_IN_PROGRESS) // Set In Progress - { -@@ -680,8 +700,10 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_n - default: - { - rc = IPMI_CC_PARM_NOT_SUPPORTED; -+ return rc; - } - } -+ rc = checkAndUpdateNetwork(channel); - - return rc; - } -Index: phosphor-host-ipmid.clean/transporthandler.hpp -=================================================================== ---- phosphor-host-ipmid.clean.orig/transporthandler.hpp -+++ phosphor-host-ipmid.clean/transporthandler.hpp -@@ -140,6 +140,7 @@ struct ChannelConfig_t - // vlan id is in 12 bits and the 16th bit is for enable mask. - uint32_t vlanID = ipmi::network::VLAN_ID_MASK; - uint8_t lan_set_in_progress = SET_COMPLETE; -+ uint8_t updateInProgress = false; - bool flush = false; - - // IPV6 parameters -@@ -165,6 +166,7 @@ struct ChannelConfig_t - vlanID = ipmi::network::VLAN_ID_MASK; - ipsrc = ipmi::network::IPOrigin::UNSPECIFIED; - lan_set_in_progress = SET_COMPLETE; -+ updateInProgress = false; - flush = false; - - // IPv6 diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0058-Add-AC-failed-bit-support-for-get-chassis-status-com.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0058-Add-AC-failed-bit-support-for-get-chassis-status-com.patch new file mode 100644 index 000000000..42bb682c4 --- /dev/null +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0058-Add-AC-failed-bit-support-for-get-chassis-status-com.patch @@ -0,0 +1,76 @@ +From f51bef8f7c5785405ee5c83a921efb1bc05e4947 Mon Sep 17 00:00:00 2001 +From: Yong Li <yong.b.li@linux.intel.com> +Date: Wed, 27 Mar 2019 16:11:25 +0800 +Subject: [PATCH] =?UTF-8?q?Add=20=E2=80=9CAC=20failed=E2=80=9D=20bit=20sup?= + =?UTF-8?q?port=20for=20get=20chassis=20status=20command?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +PFail property is provided by power control service, +ture means the booting is from AC loss. + +Tested: +Remove the AC cable and reconnect it +Ipmitool chassis status to check the status: +Last Power Event : ac-failed + +Signed-off-by: Yong Li <yong.b.li@linux.intel.com> +--- + chassishandler.cpp | 26 ++++++++++++++++++++++++++ + 1 file changed, 26 insertions(+) + +diff --git a/chassishandler.cpp b/chassishandler.cpp +index 7a522ad..40d2018 100644 +--- a/chassishandler.cpp ++++ b/chassishandler.cpp +@@ -844,6 +844,7 @@ ipmi_ret_t ipmi_get_chassis_status(ipmi_netfn_t netfn, ipmi_cmd_t cmd, + sd_bus_message* reply = NULL; + int r = 0; + int pgood = 0; ++ bool pFail = true; + char* busname = NULL; + ipmi_ret_t rc = IPMI_CC_OK; + ipmi_get_chassis_status_t chassis_status{}; +@@ -904,6 +905,26 @@ ipmi_ret_t ipmi_get_chassis_status(ipmi_netfn_t netfn, ipmi_cmd_t cmd, + goto finish; + } + ++ r = sd_bus_get_property(bus, busname, objname, intf, "PFail", NULL, &reply, ++ "b"); ++ if (r < 0) ++ { ++ log<level::ERR>("Failed to call sd_bus_get_property", ++ entry("PROPERTY=%s", "PFail"), entry("ERRNO=0x%X", -r), ++ entry("BUS=%s", busname), entry("PATH=%s", objname), ++ entry("INTERFACE=%s", intf)); ++ rc = IPMI_CC_UNSPECIFIED_ERROR; ++ goto finish; ++ } ++ ++ r = sd_bus_message_read(reply, "b", &pFail); ++ if (r < 0) ++ { ++ log<level::ERR>("Failed to read PFail:", entry("ERRNO=0x%X", -r)); ++ rc = IPMI_CC_UNSPECIFIED_ERROR; ++ goto finish; ++ } ++ + s = dbusToIpmi.at(powerRestore); + + // Current Power State +@@ -952,6 +973,11 @@ ipmi_ret_t ipmi_get_chassis_status(ipmi_netfn_t netfn, ipmi_cmd_t cmd, + + chassis_status.last_power_event = 0; + ++ if (pFail) ++ { ++ chassis_status.last_power_event |= 1; ++ } ++ + // Misc. Chassis State + // [7] – reserved + // [6] – 1b = Chassis Identify command and state info supported (Optional) +-- +2.7.4 + diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0059-Move-Set-SOL-config-parameter-to-host-ipmid.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0059-Move-Set-SOL-config-parameter-to-host-ipmid.patch new file mode 100644 index 000000000..1dc55e2f4 --- /dev/null +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0059-Move-Set-SOL-config-parameter-to-host-ipmid.patch @@ -0,0 +1,415 @@ +From 1c15df9d82254286d0773086836767f23711c5d9 Mon Sep 17 00:00:00 2001 +From: Cheng C Yang <cheng.c.yang@intel.com> +Date: Tue, 2 Apr 2019 00:34:34 +0800 +Subject: [PATCH] Move Set SOL config parameter to host-ipmid + +Move Set SOL config parameter command from net-ipmid to host-ipmid, +so that BIOS in Intel platform can enable or disable SOL through KCS. +Get SOL config parameter command will be moved later. + +Tested by: +With the related change in phospher-ipmi-net and phospher-dbus-interface, +Run commands: +ipmitool raw 0x0c 0x21 0x0e 0x00 0x01 +ipmitool raw 0x0c 0x21 0x0e 0x01 0x00 +ipmitool raw 0x0c 0x21 0x0e 0x02 0x03 +ipmitool raw 0x0c 0x21 0x0e 0x03 0x5 0x03 +ipmitool raw 0x0c 0x21 0x0e 0x04 0x5 0x03 +All these commands have correct response and all dbus interface for +sol command change to same value in above commands. +After reboot BMC, "Progress" property in dbus interface change back +to 0 and other properties will not reset to default value. + +Signed-off-by: Cheng C Yang <cheng.c.yang@intel.com> +--- + host-ipmid-whitelist.conf | 1 + + include/ipmid/api.h | 1 + + transporthandler.cpp | 222 ++++++++++++++++++++++++++++++++++++++ + transporthandler.hpp | 97 +++++++++++++++++ + 4 files changed, 321 insertions(+) + +diff --git a/host-ipmid-whitelist.conf b/host-ipmid-whitelist.conf +index 2a83347..544b766 100644 +--- a/host-ipmid-whitelist.conf ++++ b/host-ipmid-whitelist.conf +@@ -41,6 +41,7 @@ + 0x0A:0x48 //<Storage>:<Get SEL Time> + 0x0A:0x49 //<Storage>:<Set SEL Time> + 0x0C:0x02 //<Transport>:<Get LAN Configuration Parameters> ++0x0C:0x21 //<Transport>:<Set SOL Configuration Parameters> + 0x2C:0x00 //<Group Extension>:<Group Extension Command> + 0x2C:0x01 //<Group Extension>:<Get DCMI Capabilities> + 0x2C:0x02 //<Group Extension>:<Get Power Reading> +diff --git a/include/ipmid/api.h b/include/ipmid/api.h +index f08ee11..2f366b4 100644 +--- a/include/ipmid/api.h ++++ b/include/ipmid/api.h +@@ -113,6 +113,7 @@ enum ipmi_return_codes + IPMI_DCMI_CC_NO_ACTIVE_POWER_LIMIT = 0x80, + IPMI_WDOG_CC_NOT_INIT = 0x80, + IPMI_CC_SYSTEM_INFO_PARAMETER_NOT_SUPPORTED = 0x80, ++ IPMI_CC_SET_IN_PROGRESS_ACTIVE = 0x81, + IPMI_CC_SYSTEM_INFO_PARAMETER_SET_READ_ONLY = 0x82, + IPMI_CC_BUSY = 0xC0, + IPMI_CC_INVALID = 0xC1, +diff --git a/transporthandler.cpp b/transporthandler.cpp +index 8f18b76..a693279 100644 +--- a/transporthandler.cpp ++++ b/transporthandler.cpp +@@ -36,6 +36,9 @@ static const std::array<std::string, 3> ipAddressEnablesType = { + "xyz.openbmc_project.Network.EthernetInterface.IPAllowed.IPv6Only", + "xyz.openbmc_project.Network.EthernetInterface.IPAllowed.IPv4AndIPv6"}; + ++constexpr const char* solInterface = "xyz.openbmc_project.Ipmi.SOL"; ++constexpr const char* solPath = "/xyz/openbmc_project/ipmi/sol"; ++ + std::map<int, std::unique_ptr<struct ChannelConfig_t>> channelConfig; + + using namespace phosphor::logging; +@@ -1633,6 +1636,219 @@ void createNetworkTimer() + } + } + ++static int setSOLParameter(std::string property, const ipmi::Value& value) ++{ ++ auto dbus = getSdBus(); ++ ++ static std::string solService{}; ++ if (solService.empty()) ++ { ++ try ++ { ++ solService = ipmi::getService(*dbus, solInterface, solPath); ++ } ++ catch (const sdbusplus::exception::SdBusError& e) ++ { ++ solService.clear(); ++ phosphor::logging::log<phosphor::logging::level::ERR>( ++ "Error: get SOL service failed"); ++ return -1; ++ } ++ } ++ try ++ { ++ ipmi::setDbusProperty(*dbus, solService, solPath, solInterface, ++ property, value); ++ } ++ catch (sdbusplus::exception_t&) ++ { ++ phosphor::logging::log<phosphor::logging::level::ERR>( ++ "Error setting sol parameter"); ++ return -1; ++ } ++ ++ return 0; ++} ++ ++static int getSOLParameter(std::string property, ipmi::Value& value) ++{ ++ auto dbus = getSdBus(); ++ ++ static std::string solService{}; ++ if (solService.empty()) ++ { ++ try ++ { ++ solService = ipmi::getService(*dbus, solInterface, solPath); ++ } ++ catch (const sdbusplus::exception::SdBusError& e) ++ { ++ solService.clear(); ++ phosphor::logging::log<phosphor::logging::level::ERR>( ++ "Error: get SOL service failed"); ++ return -1; ++ } ++ } ++ try ++ { ++ value = ipmi::getDbusProperty(*dbus, solService, solPath, solInterface, ++ property); ++ } ++ catch (sdbusplus::exception_t&) ++ { ++ phosphor::logging::log<phosphor::logging::level::ERR>( ++ "Error getting sol parameter"); ++ return -1; ++ } ++ ++ return 0; ++} ++ ++void initializeSOLInProgress() ++{ ++ if (setSOLParameter("Progress", static_cast<uint8_t>(0)) < 0) ++ { ++ phosphor::logging::log<phosphor::logging::level::ERR>( ++ "Error initialize sol progress"); ++ } ++} ++ ++ipmi_ret_t setConfParams(ipmi_netfn_t netfn, ipmi_cmd_t cmd, ++ ipmi_request_t request, ipmi_response_t response, ++ ipmi_data_len_t dataLen, ipmi_context_t context) ++{ ++ auto reqData = reinterpret_cast<const SetConfParamsRequest*>(request); ++ ++ // Check request length first ++ switch (static_cast<sol::Parameter>(reqData->paramSelector)) ++ { ++ case sol::Parameter::progress: ++ case sol::Parameter::enable: ++ case sol::Parameter::authentication: ++ { ++ if (*dataLen != sizeof(SetConfParamsRequest) - 1) ++ { ++ *dataLen = 0; ++ return IPMI_CC_REQ_DATA_LEN_INVALID; ++ } ++ break; ++ } ++ case sol::Parameter::accumulate: ++ case sol::Parameter::retry: ++ { ++ if (*dataLen != sizeof(SetConfParamsRequest)) ++ { ++ *dataLen = 0; ++ return IPMI_CC_REQ_DATA_LEN_INVALID; ++ } ++ break; ++ } ++ default: ++ break; ++ } ++ ++ *dataLen = 0; ++ ++ switch (static_cast<sol::Parameter>(reqData->paramSelector)) ++ { ++ case sol::Parameter::progress: ++ { ++ uint8_t progress = reqData->value & progressMask; ++ ipmi::Value currentProgress = 0; ++ if (getSOLParameter("Progress", currentProgress) < 0) ++ { ++ return IPMI_CC_UNSPECIFIED_ERROR; ++ } ++ ++ if ((std::get<uint8_t>(currentProgress) == 1) && (progress == 1)) ++ { ++ return IPMI_CC_SET_IN_PROGRESS_ACTIVE; ++ } ++ ++ if (setSOLParameter("Progress", progress) < 0) ++ { ++ return IPMI_CC_UNSPECIFIED_ERROR; ++ } ++ break; ++ } ++ case sol::Parameter::enable: ++ { ++ bool enable = reqData->value & enableMask; ++ if (setSOLParameter("Enable", enable) < 0) ++ { ++ return IPMI_CC_UNSPECIFIED_ERROR; ++ } ++ break; ++ } ++ case sol::Parameter::authentication: ++ { ++ // if encryption is used authentication must also be used. ++ if (reqData->auth.encrypt && !reqData->auth.auth) ++ { ++ return IPMI_CC_SYSTEM_INFO_PARAMETER_SET_READ_ONLY; ++ } ++ else if (reqData->auth.privilege < ++ static_cast<uint8_t>(sol::Privilege::userPriv) || ++ reqData->auth.privilege > ++ static_cast<uint8_t>(sol::Privilege::oemPriv)) ++ { ++ return IPMI_CC_INVALID_FIELD_REQUEST; ++ } ++ ++ if ((setSOLParameter("Privilege", reqData->auth.privilege) < 0) || ++ (setSOLParameter("ForceEncryption", ++ static_cast<bool>(reqData->auth.encrypt)) < ++ 0) || ++ (setSOLParameter("ForceAuthentication", ++ static_cast<bool>(reqData->auth.auth)) < 0)) ++ { ++ return IPMI_CC_UNSPECIFIED_ERROR; ++ } ++ ++ break; ++ } ++ case sol::Parameter::accumulate: ++ { ++ if (reqData->acc.threshold == 0) ++ { ++ return IPMI_CC_INVALID_FIELD_REQUEST; ++ } ++ if (setSOLParameter("AccumulateIntervalMS", reqData->acc.interval) < ++ 0) ++ { ++ return IPMI_CC_UNSPECIFIED_ERROR; ++ } ++ if (setSOLParameter("Threshold", reqData->acc.threshold) < 0) ++ { ++ return IPMI_CC_UNSPECIFIED_ERROR; ++ } ++ break; ++ } ++ case sol::Parameter::retry: ++ { ++ if ((setSOLParameter("RetryCount", reqData->retry.count) < 0) || ++ (setSOLParameter("RetryIntervalMS", reqData->retry.interval) < ++ 0)) ++ { ++ return IPMI_CC_UNSPECIFIED_ERROR; ++ } ++ ++ break; ++ } ++ case sol::Parameter::port: ++ { ++ return IPMI_CC_SYSTEM_INFO_PARAMETER_SET_READ_ONLY; ++ } ++ case sol::Parameter::nvbitrate: ++ case sol::Parameter::vbitrate: ++ case sol::Parameter::channel: ++ default: ++ return IPMI_CC_PARM_NOT_SUPPORTED; ++ } ++ ++ return IPMI_CC_OK; ++} ++ + void register_netfn_transport_functions() + { + // As this timer is only for transport handler +@@ -1650,5 +1866,11 @@ void register_netfn_transport_functions() + ipmi_register_callback(NETFUN_TRANSPORT, IPMI_CMD_GET_LAN, NULL, + ipmi_transport_get_lan, PRIVILEGE_OPERATOR); + ++ ipmi_register_callback(NETFUN_TRANSPORT, IPMI_CMD_SET_SOL_CONF_PARAMS, NULL, ++ setConfParams, PRIVILEGE_ADMIN); ++ ++ // Initialize dbus property progress to 0 every time sol manager restart. ++ initializeSOLInProgress(); ++ + return; + } +diff --git a/transporthandler.hpp b/transporthandler.hpp +index bd23391..3b5e9e1 100644 +--- a/transporthandler.hpp ++++ b/transporthandler.hpp +@@ -8,6 +8,8 @@ enum ipmi_netfn_storage_cmds + // Get capability bits + IPMI_CMD_SET_LAN = 0x01, + IPMI_CMD_GET_LAN = 0x02, ++ IPMI_CMD_SET_SOL_CONF_PARAMS = 0x21, ++ IPMI_CMD_GET_SOL_CONF_PARAMS = 0x22, + }; + + // Command specific completion codes +@@ -186,3 +188,98 @@ void commitNetworkChanges(); + * @param[in] channel: channel number. + */ + void applyChanges(int channel); ++ ++namespace sol ++{ ++enum class Parameter ++{ ++ progress, //!< Set In Progress. ++ enable, //!< SOL Enable. ++ authentication, //!< SOL Authentication. ++ accumulate, //!< Character Accumulate Interval & Send Threshold. ++ retry, //!< SOL Retry. ++ nvbitrate, //!< SOL non-volatile bit rate. ++ vbitrate, //!< SOL volatile bit rate. ++ channel, //!< SOL payload channel. ++ port, //!< SOL payload port. ++}; ++ ++enum class Privilege : uint8_t ++{ ++ highestPriv, ++ callbackPriv, ++ userPriv, ++ operatorPriv, ++ adminPriv, ++ oemPriv, ++}; ++ ++} // namespace sol ++ ++constexpr uint8_t progressMask = 0x03; ++constexpr uint8_t enableMask = 0x01; ++ ++struct Auth ++{ ++#if BYTE_ORDER == LITTLE_ENDIAN ++ uint8_t privilege : 4; //!< SOL privilege level. ++ uint8_t reserved : 2; //!< Reserved. ++ uint8_t auth : 1; //!< Force SOL payload Authentication. ++ uint8_t encrypt : 1; //!< Force SOL payload encryption. ++#endif ++ ++#if BYTE_ORDER == BIG_ENDIAN ++ uint8_t encrypt : 1; //!< Force SOL payload encryption. ++ uint8_t auth : 1; //!< Force SOL payload Authentication. ++ uint8_t reserved : 2; //!< Reserved. ++ uint8_t privilege : 4; //!< SOL privilege level. ++#endif ++} __attribute__((packed)); ++ ++struct Accumulate ++{ ++ uint8_t interval; //!< Character accumulate interval. ++ uint8_t threshold; //!< Character send threshold. ++} __attribute__((packed)); ++ ++struct Retry ++{ ++#if BYTE_ORDER == LITTLE_ENDIAN ++ uint8_t count : 3; //!< SOL retry count. ++ uint8_t reserved : 5; //!< Reserved. ++#endif ++ ++#if BYTE_ORDER == BIG_ENDIAN ++ uint8_t reserved : 5; //!< Reserved. ++ uint8_t count : 3; //!< SOL retry count. ++#endif ++ ++ uint8_t interval; //!< SOL retry interval. ++} __attribute__((packed)); ++ ++struct SetConfParamsRequest ++{ ++#if BYTE_ORDER == LITTLE_ENDIAN ++ uint8_t channelNumber : 4; //!< Channel number. ++ uint8_t reserved : 4; //!< Reserved. ++#endif ++ ++#if BYTE_ORDER == BIG_ENDIAN ++ uint8_t reserved : 4; //!< Reserved. ++ uint8_t channelNumber : 4; //!< Channel number. ++#endif ++ ++ uint8_t paramSelector; //!< Parameter selector. ++ union ++ { ++ uint8_t value; //!< Represents one byte SOL parameters. ++ struct Accumulate acc; //!< Character accumulate values. ++ struct Retry retry; //!< Retry values. ++ struct Auth auth; //!< Authentication parameters. ++ }; ++} __attribute__((packed)); ++ ++struct SetConfParamsResponse ++{ ++ uint8_t completionCode; //!< Completion code. ++} __attribute__((packed)); +-- +2.17.1 + diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0060-Move-Get-SOL-config-parameter-to-host-ipmid.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0060-Move-Get-SOL-config-parameter-to-host-ipmid.patch new file mode 100644 index 000000000..49a2c01ba --- /dev/null +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0060-Move-Get-SOL-config-parameter-to-host-ipmid.patch @@ -0,0 +1,248 @@ +From 973865687325c6563fd6b729a3a220661066f635 Mon Sep 17 00:00:00 2001 +From: Cheng C Yang <cheng.c.yang@intel.com> +Date: Wed, 3 Apr 2019 15:55:04 +0800 +Subject: [PATCH] Move Get SOL config parameter to host-ipmid + +Move Get SOL config parameter command from net-ipmid to host-ipmid. + +Tested By: +Run command ipmitool sol info +Set in progress : set-complete +Enabled : true +Force Encryption : false +Force Authentication : false +Privilege Level : USER +Character Accumulate Level (ms) : 100 +Character Send Threshold : 1 +Retry Count : 3 +Retry Interval (ms) : 100 +Volatile Bit Rate (kbps) : IPMI-Over-Serial-Setting +Non-Volatile Bit Rate (kbps) : IPMI-Over-Serial-Setting +Payload Channel : 14 (0x0e) +Payload Port : 623 + +Signed-off-by: Cheng C Yang <cheng.c.yang@intel.com> +--- + transporthandler.cpp | 139 ++++++++++++++++++++++++++++++++++++++++++++++++--- + transporthandler.hpp | 26 +++++++++- + 2 files changed, 156 insertions(+), 9 deletions(-) + +diff --git a/transporthandler.cpp b/transporthandler.cpp +index 2111acf..b18f522 100644 +--- a/transporthandler.cpp ++++ b/transporthandler.cpp +@@ -1715,11 +1715,133 @@ void initializeSOLInProgress() + } + } + +-ipmi_ret_t setConfParams(ipmi_netfn_t netfn, ipmi_cmd_t cmd, +- ipmi_request_t request, ipmi_response_t response, +- ipmi_data_len_t dataLen, ipmi_context_t context) ++// For getsetSOLConfParams, there are still three tings TODO: ++// 1. session less channel number request has to return error. ++// 2. convert 0xE channel number. ++// 3. have unique object for every session based channel. ++ipmi_ret_t getSOLConfParams(ipmi_netfn_t netfn, ipmi_cmd_t cmd, ++ ipmi_request_t request, ipmi_response_t response, ++ ipmi_data_len_t dataLen, ipmi_context_t context) + { +- auto reqData = reinterpret_cast<const SetConfParamsRequest*>(request); ++ auto reqData = reinterpret_cast<const GetSOLConfParamsRequest*>(request); ++ std::vector<uint8_t> outPayload; ++ ++ if (*dataLen < sizeof(GetSOLConfParamsRequest) - 2) ++ { ++ *dataLen = 0; ++ return IPMI_CC_REQ_DATA_LEN_INVALID; ++ } ++ ++ *dataLen = 0; ++ ++ outPayload.push_back(solParameterRevision); ++ if (reqData->getParamRev) ++ { ++ std::copy(outPayload.begin(), outPayload.end(), ++ static_cast<uint8_t*>(response)); ++ *dataLen = outPayload.size(); ++ return IPMI_CC_OK; ++ } ++ ++ ipmi::Value value; ++ switch (static_cast<sol::Parameter>(reqData->paramSelector)) ++ { ++ case sol::Parameter::progress: ++ { ++ if (getSOLParameter("Progress", value) < 0) ++ { ++ return IPMI_CC_UNSPECIFIED_ERROR; ++ } ++ outPayload.push_back(std::get<uint8_t>(value)); ++ break; ++ } ++ case sol::Parameter::enable: ++ { ++ if (getSOLParameter("Enable", value) < 0) ++ { ++ return IPMI_CC_UNSPECIFIED_ERROR; ++ } ++ outPayload.push_back(static_cast<uint8_t>(std::get<bool>(value))); ++ break; ++ } ++ case sol::Parameter::authentication: ++ { ++ uint8_t authentication = 0; ++ if (getSOLParameter("Privilege", value) < 0) ++ { ++ return IPMI_CC_UNSPECIFIED_ERROR; ++ } ++ authentication = (std::get<uint8_t>(value) & 0x0f); ++ ++ if (getSOLParameter("ForceAuthentication", value) < 0) ++ { ++ return IPMI_CC_UNSPECIFIED_ERROR; ++ } ++ authentication |= ++ (static_cast<uint8_t>(std::get<bool>(value)) << 6); ++ ++ if (getSOLParameter("ForceEncryption", value) < 0) ++ { ++ return IPMI_CC_UNSPECIFIED_ERROR; ++ } ++ authentication |= ++ (static_cast<uint8_t>(std::get<bool>(value)) << 7); ++ outPayload.push_back(authentication); ++ break; ++ } ++ case sol::Parameter::accumulate: ++ { ++ if (getSOLParameter("AccumulateIntervalMS", value) < 0) ++ { ++ return IPMI_CC_UNSPECIFIED_ERROR; ++ } ++ outPayload.push_back(std::get<uint8_t>(value)); ++ ++ if (getSOLParameter("Threshold", value) < 0) ++ { ++ return IPMI_CC_UNSPECIFIED_ERROR; ++ } ++ outPayload.push_back(std::get<uint8_t>(value)); ++ break; ++ } ++ case sol::Parameter::retry: ++ { ++ if (getSOLParameter("RetryCount", value) < 0) ++ { ++ return IPMI_CC_UNSPECIFIED_ERROR; ++ } ++ outPayload.push_back(std::get<uint8_t>(value) & 0x03); ++ ++ if (getSOLParameter("RetryIntervalMS", value) < 0) ++ { ++ return IPMI_CC_UNSPECIFIED_ERROR; ++ } ++ outPayload.push_back(std::get<uint8_t>(value)); ++ break; ++ } ++ case sol::Parameter::port: ++ { ++ uint16_t port = htole16(ipmiStdPort); ++ auto buffer = reinterpret_cast<const uint8_t*>(&port); ++ std::copy(buffer, buffer + sizeof(port), ++ std::back_inserter(outPayload)); ++ break; ++ } ++ default: ++ return IPMI_CC_PARM_NOT_SUPPORTED; ++ } ++ std::copy(outPayload.begin(), outPayload.end(), ++ static_cast<uint8_t*>(response)); ++ *dataLen = outPayload.size(); ++ ++ return IPMI_CC_OK; ++} ++ ++ipmi_ret_t setSOLConfParams(ipmi_netfn_t netfn, ipmi_cmd_t cmd, ++ ipmi_request_t request, ipmi_response_t response, ++ ipmi_data_len_t dataLen, ipmi_context_t context) ++{ ++ auto reqData = reinterpret_cast<const SetSOLConfParamsRequest*>(request); + + // Check request length first + switch (static_cast<sol::Parameter>(reqData->paramSelector)) +@@ -1728,7 +1850,7 @@ ipmi_ret_t setConfParams(ipmi_netfn_t netfn, ipmi_cmd_t cmd, + case sol::Parameter::enable: + case sol::Parameter::authentication: + { +- if (*dataLen != sizeof(SetConfParamsRequest) - 1) ++ if (*dataLen != sizeof(SetSOLConfParamsRequest) - 1) + { + *dataLen = 0; + return IPMI_CC_REQ_DATA_LEN_INVALID; +@@ -1738,7 +1860,7 @@ ipmi_ret_t setConfParams(ipmi_netfn_t netfn, ipmi_cmd_t cmd, + case sol::Parameter::accumulate: + case sol::Parameter::retry: + { +- if (*dataLen != sizeof(SetConfParamsRequest)) ++ if (*dataLen != sizeof(SetSOLConfParamsRequest)) + { + *dataLen = 0; + return IPMI_CC_REQ_DATA_LEN_INVALID; +@@ -1869,7 +1991,10 @@ void register_netfn_transport_functions() + ipmi_transport_get_lan, PRIVILEGE_OPERATOR); + + ipmi_register_callback(NETFUN_TRANSPORT, IPMI_CMD_SET_SOL_CONF_PARAMS, NULL, +- setConfParams, PRIVILEGE_ADMIN); ++ setSOLConfParams, PRIVILEGE_ADMIN); ++ ++ ipmi_register_callback(NETFUN_TRANSPORT, IPMI_CMD_GET_SOL_CONF_PARAMS, NULL, ++ getSOLConfParams, PRIVILEGE_ADMIN); + + // Initialize dbus property progress to 0 every time sol manager restart. + initializeSOLInProgress(); +diff --git a/transporthandler.hpp b/transporthandler.hpp +index 3b5e9e1..7132cff 100644 +--- a/transporthandler.hpp ++++ b/transporthandler.hpp +@@ -257,7 +257,7 @@ struct Retry + uint8_t interval; //!< SOL retry interval. + } __attribute__((packed)); + +-struct SetConfParamsRequest ++struct SetSOLConfParamsRequest + { + #if BYTE_ORDER == LITTLE_ENDIAN + uint8_t channelNumber : 4; //!< Channel number. +@@ -279,7 +279,29 @@ struct SetConfParamsRequest + }; + } __attribute__((packed)); + +-struct SetConfParamsResponse ++struct SetSOLConfParamsResponse + { + uint8_t completionCode; //!< Completion code. + } __attribute__((packed)); ++ ++struct GetSOLConfParamsRequest ++{ ++#if BYTE_ORDER == LITTLE_ENDIAN ++ uint8_t channelNum : 4; //!< Channel number. ++ uint8_t reserved : 3; //!< Reserved. ++ uint8_t getParamRev : 1; //!< Get parameter or Get parameter revision ++#endif ++ ++#if BYTE_ORDER == BIG_ENDIAN ++ uint8_t getParamRev : 1; //!< Get parameter or Get parameter revision ++ uint8_t reserved : 3; //!< Reserved. ++ uint8_t channelNum : 4; //!< Channel number. ++#endif ++ ++ uint8_t paramSelector; //!< Parameter selector. ++ uint8_t setSelector; //!< Set selector. ++ uint8_t blockSelector; //!< Block selector. ++} __attribute__((packed)); ++ ++static constexpr uint16_t ipmiStdPort = 623; ++static constexpr uint8_t solParameterRevision = 0x11; +-- +2.16.2 + diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host_%.bbappend b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host_%.bbappend index 2d47fdfff..f454f7ce9 100644 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host_%.bbappend +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host_%.bbappend @@ -3,7 +3,7 @@ FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" # TODO: This should be removed, once up-stream bump up # issue is resolved #SRC_URI = "git://github.com/openbmc/phosphor-host-ipmid" -SRCREV = "55768e3548ef7476d4fdbe7be7a3ddb4d4896f14" +SRCREV = "11df4f6906edc0dfb23089a6e297158549c19ebd" SRC_URI += "file://phosphor-ipmi-host.service \ file://0002-Modify-dbus-interface-for-power-control.patch \ @@ -13,25 +13,17 @@ SRC_URI += "file://phosphor-ipmi-host.service \ file://0012-ipmi-set-get-boot-options.patch \ file://0013-ipmi-add-set-bios-id-to-whitelist.patch \ file://0014-Enable-get-device-guid-ipmi-command.patch \ - file://0016-add-better-sdbusplus-exception-handling.patch \ - file://0018-Catch-sdbusplus-exceptions-in-IPMI-net.patch \ file://0021-Implement-IPMI-Commmand-Get-Host-Restart-Cause.patch \ file://0039-ipmi-add-oem-command-get-AIC-FRU-to-whitelist.patch \ file://0048-Implement-IPMI-Master-Write-Read-command.patch \ file://0049-Fix-Unspecified-error-on-ipmi-restart-cause-command.patch \ file://0050-enable-6-oem-commands.patch \ - file://0051-Fix-Set-LAN-Config-to-work-without-SetInProgress.patch \ file://0053-Fix-keep-looping-issue-when-entering-OS.patch \ file://0055-Implement-set-front-panel-button-enables-command.patch \ file://0056-add-SetInProgress-to-get-set-boot-option-cmd.patch \ file://0057-Add-timer-use-actions-support.patch \ + file://0058-Add-AC-failed-bit-support-for-get-chassis-status-com.patch \ + file://0059-Move-Set-SOL-config-parameter-to-host-ipmid.patch \ + file://0060-Move-Get-SOL-config-parameter-to-host-ipmid.patch \ " -do_install_append(){ - install -d ${D}${includedir}/phosphor-ipmi-host - install -d ${D}${libdir}/phosphor-ipmi-host - install -m 0644 -D ${S}/*.h ${D}${includedir}/phosphor-ipmi-host - install -m 0644 -D ${S}/*.hpp ${D}${includedir}/phosphor-ipmi-host - install -m 0644 -D ${S}/utils.cpp ${D}${libdir}/phosphor-ipmi-host - -} diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-ipmb_%.bbappend b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-ipmb_%.bbappend index d5d38a0ce..694bd1fcf 100644 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-ipmb_%.bbappend +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-ipmb_%.bbappend @@ -1,2 +1,2 @@ SRC_URI = "git://github.com/openbmc/ipmbbridge.git" -SRCREV = "25e85c79257723b1cb754c20299196685373ce24" +SRCREV = "08deaa317c7ac0dd6e4202529ff17962c63df485" diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-net/00010-Change-Authentication-Parameter.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-net/00010-Change-Authentication-Parameter.patch new file mode 100644 index 000000000..867b3aba6 --- /dev/null +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-net/00010-Change-Authentication-Parameter.patch @@ -0,0 +1,40 @@ +From 0fd38eb0a155cb11ff5a5452087f68c46d12111b Mon Sep 17 00:00:00 2001 +From: Cheng C Yang <cheng.c.yang@intel.com> +Date: Thu, 28 Mar 2019 18:10:40 +0800 +Subject: [PATCH] Change Authentication Parameter + +Seprate D-bus interface Authentication to forceAuthentication, +forceEncryption, Privilege according to the related change in +sol-dbus-interface. + +Tested By: +ipmitool -I lanplus -H x -U x -P x raw 0x0c 0x21 0x0e 0x02 0x03 +ipmitool -I lanplus -H x -U x -P x raw 0x0c 0x21 0x0e 0x02 0xc2 +The parameters has been changed to the request data in above command. + +Signed-off-by: Cheng C Yang <cheng.c.yang@intel.com> +--- + sol/sol_manager.cpp | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/sol/sol_manager.cpp b/sol/sol_manager.cpp +index de36723..0bd837e 100644 +--- a/sol/sol_manager.cpp ++++ b/sol/sol_manager.cpp +@@ -195,8 +195,12 @@ void Manager::updateSOLParameter() + + enable = std::get<bool>(properties["Enable"]); + ++ forceEncrypt = std::get<bool>(properties["ForceEncryption"]); ++ ++ forceAuth = std::get<bool>(properties["ForceAuthentication"]); ++ + solMinPrivilege = static_cast<session::Privilege>( +- std::get<uint8_t>(properties["Authentication"])); ++ std::get<uint8_t>(properties["Privilege"])); + + accumulateInterval = + std::get<uint8_t>((properties["AccumulateIntervalMS"])) * +-- +2.16.2 + diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-net/0006-Modify-dbus-namespace-of-chassis-control-for-guid.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-net/0006-Modify-dbus-namespace-of-chassis-control-for-guid.patch index 7225c7529..0ad625a1f 100644 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-net/0006-Modify-dbus-namespace-of-chassis-control-for-guid.patch +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-net/0006-Modify-dbus-namespace-of-chassis-control-for-guid.patch @@ -24,7 +24,7 @@ Index: phosphor-net-ipmid.clean/command/guid.cpp -static constexpr auto guidObjPath = "/org/openbmc/control/chassis0"; +static constexpr auto guidObjPath = -+ "/xyz/openbmc_project/Chassis/Control/Chassis0"; ++ "/xyz/openbmc_project/Chassis/Control/Chassis0"; static constexpr auto propInterface = "org.freedesktop.DBus.Properties"; Guid getSystemGUID() diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-net/0007-Adding-support-for-GetSessionInfo-command.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-net/0007-Adding-support-for-GetSessionInfo-command.patch index fda7ed2ca..bbbe6ae4f 100644 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-net/0007-Adding-support-for-GetSessionInfo-command.patch +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-net/0007-Adding-support-for-GetSessionInfo-command.patch @@ -1,7 +1,7 @@ -From f5c7d30be4a097998d9390614c0faa2d77109ca5 Mon Sep 17 00:00:00 2001 +From b05fb3231810865ef1b6e627bb0452ae7a6c61f8 Mon Sep 17 00:00:00 2001 From: ssekar <suryakanth.sekar@linux.intel.com> Date: Wed, 12 Dec 2018 16:04:15 +0530 -Subject: [PATCH] Adding support for GetSessionInfo command +Subject: [PATCH 1/2] Adding support for GetSessionInfo command Description: user can get all session info (remote ip,port, session id, priv, etc) using this command. @@ -20,14 +20,13 @@ Signed-off-by: ssekar <suryakanth.sekar@linux.intel.com> message_handler.cpp | 1 + sessions_manager.cpp | 55 +++++++++++++++ sessions_manager.hpp | 7 ++ - socket_channel.cpp | 27 ++++++- - socket_channel.hpp | 3 +- - 8 files changed, 301 insertions(+), 2 deletions(-) + socket_channel.hpp | 17 +++++ + 7 files changed, 290 insertions(+) -Index: phosphor-net-ipmid.clean/comm_module.cpp -=================================================================== ---- phosphor-net-ipmid.clean.orig/comm_module.cpp -+++ phosphor-net-ipmid.clean/comm_module.cpp +diff --git a/comm_module.cpp b/comm_module.cpp +index acc9089..7a1a17d 100644 +--- a/comm_module.cpp ++++ b/comm_module.cpp @@ -53,6 +53,14 @@ void sessionSetupCommands() &closeSession, session::Privilege::CALLBACK, @@ -43,20 +42,14 @@ Index: phosphor-net-ipmid.clean/comm_module.cpp }; for (auto& iter : commands) -Index: phosphor-net-ipmid.clean/command/session_cmds.cpp -=================================================================== ---- phosphor-net-ipmid.clean.orig/command/session_cmds.cpp -+++ phosphor-net-ipmid.clean/command/session_cmds.cpp -@@ -5,11 +5,19 @@ - - #include <host-ipmid/ipmid-api.h> - -+#include <iostream> - #include <user_channel/channel_layer.hpp> - #include <user_channel/user_layer.hpp> - +diff --git a/command/session_cmds.cpp b/command/session_cmds.cpp +index 8606ce5..4beeb6e 100644 +--- a/command/session_cmds.cpp ++++ b/command/session_cmds.cpp +@@ -8,6 +8,14 @@ namespace command { + +// Defined as per IPMI sepcification +static constexpr uint8_t searchCurrentSession = 0x00; +static constexpr uint8_t searchSessionByHandle = 0xFE; @@ -64,10 +57,11 @@ Index: phosphor-net-ipmid.clean/command/session_cmds.cpp + +static constexpr uint8_t ipmi15VerSession = 0x00; +static constexpr uint8_t ipmi20VerSession = 0x01; - ++ std::vector<uint8_t> setSessionPrivilegeLevel(const std::vector<uint8_t>& inPayload, -@@ -110,4 +118,143 @@ std::vector<uint8_t> closeSession(const + const message::Handler& handler) +@@ -92,4 +100,143 @@ std::vector<uint8_t> closeSession(const std::vector<uint8_t>& inPayload, return outPayload; } @@ -211,10 +205,10 @@ Index: phosphor-net-ipmid.clean/command/session_cmds.cpp +} + } // namespace command -Index: phosphor-net-ipmid.clean/command/session_cmds.hpp -=================================================================== ---- phosphor-net-ipmid.clean.orig/command/session_cmds.hpp -+++ phosphor-net-ipmid.clean/command/session_cmds.hpp +diff --git a/command/session_cmds.hpp b/command/session_cmds.hpp +index 9737fdb..741de23 100644 +--- a/command/session_cmds.hpp ++++ b/command/session_cmds.hpp @@ -116,4 +116,59 @@ struct CloseSessionResponse std::vector<uint8_t> closeSession(const std::vector<uint8_t>& inPayload, const message::Handler& handler); @@ -275,22 +269,22 @@ Index: phosphor-net-ipmid.clean/command/session_cmds.hpp + const message::Handler& handler); + } // namespace command -Index: phosphor-net-ipmid.clean/message_handler.cpp -=================================================================== ---- phosphor-net-ipmid.clean.orig/message_handler.cpp -+++ phosphor-net-ipmid.clean/message_handler.cpp -@@ -43,6 +43,7 @@ std::shared_ptr<Message> Handler::receiv - sessionID = message->bmcSessionID; - message->rcSessionID = session->getRCSessionID(); +diff --git a/message_handler.cpp b/message_handler.cpp +index e2aafb3..b335236 100644 +--- a/message_handler.cpp ++++ b/message_handler.cpp +@@ -43,6 +43,7 @@ bool Handler::receive() + sessionID = inMessage->bmcSessionID; + inMessage->rcSessionID = session->getRCSessionID(); session->updateLastTransactionTime(); + session->channelPtr = channel; - return message; + return true; } -Index: phosphor-net-ipmid.clean/sessions_manager.cpp -=================================================================== ---- phosphor-net-ipmid.clean.orig/sessions_manager.cpp -+++ phosphor-net-ipmid.clean/sessions_manager.cpp +diff --git a/sessions_manager.cpp b/sessions_manager.cpp +index 95a8a15..9f3210b 100644 +--- a/sessions_manager.cpp ++++ b/sessions_manager.cpp @@ -88,6 +88,9 @@ std::shared_ptr<Session> } sessionID = session->getBMCSessionID(); @@ -301,7 +295,7 @@ Index: phosphor-net-ipmid.clean/sessions_manager.cpp return session; } -@@ -149,12 +152,15 @@ std::shared_ptr<Session> Manager::getSes +@@ -149,12 +152,15 @@ std::shared_ptr<Session> Manager::getSession(SessionID sessionID, void Manager::cleanStaleEntries() { @@ -371,10 +365,10 @@ Index: phosphor-net-ipmid.clean/sessions_manager.cpp + return count; +} } // namespace session -Index: phosphor-net-ipmid.clean/sessions_manager.hpp -=================================================================== ---- phosphor-net-ipmid.clean.orig/sessions_manager.hpp -+++ phosphor-net-ipmid.clean/sessions_manager.hpp +diff --git a/sessions_manager.hpp b/sessions_manager.hpp +index 9fd38b1..f6ed1c3 100644 +--- a/sessions_manager.hpp ++++ b/sessions_manager.hpp @@ -82,8 +82,15 @@ class Manager std::shared_ptr<Session> getSession(SessionID sessionID, @@ -391,14 +385,15 @@ Index: phosphor-net-ipmid.clean/sessions_manager.hpp /** * @brief Session Manager keeps the session objects as a sorted * associative container with Session ID as the unique key -Index: phosphor-net-ipmid.clean/socket_channel.hpp -=================================================================== ---- phosphor-net-ipmid.clean.orig/socket_channel.hpp -+++ phosphor-net-ipmid.clean/socket_channel.hpp -@@ -65,6 +65,23 @@ class Channel +diff --git a/socket_channel.hpp b/socket_channel.hpp +index ebe0c8f..349701e 100644 +--- a/socket_channel.hpp ++++ b/socket_channel.hpp +@@ -64,6 +64,23 @@ class Channel + return endpoint.port(); } - /** ++ /** + * @brief Return the binary representation of the remote IPv4 address + * + * getSessionInfo needs to return the remote IPv4 addresses of each session @@ -415,7 +410,9 @@ Index: phosphor-net-ipmid.clean/socket_channel.hpp + return 0; + } + -+ /** + /** * @brief Read the incoming packet * - * Reads the data available on the socket +-- +2.17.1 + diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-net/0008-Sync-GetSession-Info-cmd-based-on-Upstream-review.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-net/0008-Sync-GetSession-Info-cmd-based-on-Upstream-review.patch index 1a109a571..6212c0724 100644 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-net/0008-Sync-GetSession-Info-cmd-based-on-Upstream-review.patch +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-net/0008-Sync-GetSession-Info-cmd-based-on-Upstream-review.patch @@ -1,16 +1,16 @@ -From 0ecc7c816ad4836f8f54922ba92cb527f5978d5a Mon Sep 17 00:00:00 2001 +From a413e390563205476656a9005ca447f5b626872f Mon Sep 17 00:00:00 2001 From: Suryakanth Sekar <suryakanth.sekar@linux.intel.com> Date: Wed, 6 Mar 2019 10:35:56 +0530 -Subject: [PATCH] Sync GetSession Info cmd based on Upstream review +Subject: [PATCH 2/2] Sync GetSession Info cmd based on Upstream review Signed-off-by: Suryakanth Sekar <suryakanth.sekar@linux.intel.com> --- - comm_module.cpp | 12 ++++---- - command/session_cmds.cpp | 72 +++++++++++++++++++++--------------------------- - sessions_manager.cpp | 10 +++---- + comm_module.cpp | 12 +++---- + command/session_cmds.cpp | 71 ++++++++++++++++++---------------------- + sessions_manager.cpp | 10 +++--- sessions_manager.hpp | 2 +- - socket_channel.hpp | 33 +++++++++++----------- - 5 files changed, 59 insertions(+), 70 deletions(-) + socket_channel.hpp | 33 ++++++++++--------- + 5 files changed, 59 insertions(+), 69 deletions(-) diff --git a/comm_module.cpp b/comm_module.cpp index 7a1a17d..2546583 100644 @@ -36,25 +36,19 @@ index 7a1a17d..2546583 100644 for (auto& iter : commands) diff --git a/command/session_cmds.cpp b/command/session_cmds.cpp -index 7563b18..fc996a4 100644 +index 4beeb6e..0c3a4ed 100644 --- a/command/session_cmds.cpp +++ b/command/session_cmds.cpp -@@ -5,13 +5,12 @@ - - #include <ipmid/api.h> - --#include <iostream> - #include <user_channel/channel_layer.hpp> - #include <user_channel/user_layer.hpp> - +@@ -8,7 +8,7 @@ namespace command { + -// Defined as per IPMI sepcification +// Defined as per IPMI specification static constexpr uint8_t searchCurrentSession = 0x00; static constexpr uint8_t searchSessionByHandle = 0xFE; static constexpr uint8_t searchSessionByID = 0xFF; -@@ -129,20 +128,6 @@ std::vector<uint8_t> getSessionInfo(const std::vector<uint8_t>& inPayload, +@@ -111,20 +111,6 @@ std::vector<uint8_t> getSessionInfo(const std::vector<uint8_t>& inPayload, reinterpret_cast<GetSessionInfoResponse*>(outPayload.data()); uint32_t reqSessionID = handler.sessionID; response->completionCode = IPMI_CC_OK; @@ -75,7 +69,7 @@ index 7563b18..fc996a4 100644 // Here we look for session info according to session index parameter switch (request->sessionIndex) -@@ -150,29 +135,22 @@ std::vector<uint8_t> getSessionInfo(const std::vector<uint8_t>& inPayload, +@@ -132,29 +118,22 @@ std::vector<uint8_t> getSessionInfo(const std::vector<uint8_t>& inPayload, // Look for current active session which this cmd is received over case searchCurrentSession: // Request data should only contain session index byte @@ -110,7 +104,7 @@ index 7563b18..fc996a4 100644 } // Retrieve session id based on session handle -@@ -186,7 +164,7 @@ std::vector<uint8_t> getSessionInfo(const std::vector<uint8_t>& inPayload, +@@ -168,7 +147,7 @@ std::vector<uint8_t> getSessionInfo(const std::vector<uint8_t>& inPayload, { response->completionCode = IPMI_CC_INVALID_FIELD_REQUEST; outPayload.resize(sizeof(response->completionCode)); @@ -119,7 +113,7 @@ index 7563b18..fc996a4 100644 } break; case searchSessionByID: -@@ -196,23 +174,38 @@ std::vector<uint8_t> getSessionInfo(const std::vector<uint8_t>& inPayload, +@@ -178,23 +157,38 @@ std::vector<uint8_t> getSessionInfo(const std::vector<uint8_t>& inPayload, { response->completionCode = IPMI_CC_REQ_DATA_LEN_INVALID; outPayload.resize(sizeof(response->completionCode)); @@ -162,7 +156,7 @@ index 7563b18..fc996a4 100644 response->sessionHandle = 0; if (reqSessionID != 0) { -@@ -225,9 +218,9 @@ std::vector<uint8_t> getSessionInfo(const std::vector<uint8_t>& inPayload, +@@ -207,9 +201,9 @@ std::vector<uint8_t> getSessionInfo(const std::vector<uint8_t>& inPayload, } catch (std::exception& e) { @@ -174,7 +168,7 @@ index 7563b18..fc996a4 100644 } response->sessionHandle = std::get<session::Manager&>(singletonPool) .getSessionHandle(reqSessionID); -@@ -236,25 +229,24 @@ std::vector<uint8_t> getSessionInfo(const std::vector<uint8_t>& inPayload, +@@ -218,25 +212,24 @@ std::vector<uint8_t> getSessionInfo(const std::vector<uint8_t>& inPayload, { response->completionCode = IPMI_CC_UNSPECIFIED_ERROR; outPayload.resize(sizeof(response->completionCode)); @@ -246,7 +240,7 @@ index 9f3210b..c6897c6 100644 uint8_t count = 0; for (const auto& it : sessionsMap) diff --git a/sessions_manager.hpp b/sessions_manager.hpp -index c4caad4..3a3825d 100644 +index f6ed1c3..3ff213e 100644 --- a/sessions_manager.hpp +++ b/sessions_manager.hpp @@ -82,7 +82,7 @@ class Manager @@ -314,5 +308,5 @@ index 349701e..8b64740 100644 /** -- -2.7.4 +2.17.1 diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-net/0009-Add-dbus-interface-for-sol-commands.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-net/0009-Add-dbus-interface-for-sol-commands.patch index 771120120..c90cccf34 100644 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-net/0009-Add-dbus-interface-for-sol-commands.patch +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-net/0009-Add-dbus-interface-for-sol-commands.patch @@ -147,7 +147,7 @@ index 2046fe4..de36723 100644 #include <boost/asio/write.hpp> #include <chrono> #include <cmath> -+#include <phosphor-ipmi-host/utils.hpp> ++#include <ipmid/utils.hpp> #include <phosphor-logging/log.hpp> +#include <sdbusplus/message/types.hpp> + diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-net_%.bbappend b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-net_%.bbappend index 4b82cc21c..9dc21a3dd 100644 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-net_%.bbappend +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-net_%.bbappend @@ -3,7 +3,7 @@ inherit useradd # TODO: This should be removed, once up-stream bump up # issue is resolved #SRC_URI += "git://github.com/openbmc/phosphor-net-ipmid" -SRCREV = "7e5d38d2fb51fc746624ff2f2b3701cea245a8fb" +#SRCREV = "8af90ebcc552e243ae85aa9e9da1a00fbecab56c" USERADD_PACKAGES = "${PN}" # add a group called ipmi @@ -15,5 +15,6 @@ SRC_URI += " file://0006-Modify-dbus-namespace-of-chassis-control-for-guid.patch file://0007-Adding-support-for-GetSessionInfo-command.patch \ file://0008-Sync-GetSession-Info-cmd-based-on-Upstream-review.patch \ file://0009-Add-dbus-interface-for-sol-commands.patch \ + file://00010-Change-Authentication-Parameter.patch \ " diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-node-manager-proxy_git.bb b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-node-manager-proxy_git.bb index 09d2f9c41..af83facf6 100644 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-node-manager-proxy_git.bb +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-node-manager-proxy_git.bb @@ -3,7 +3,7 @@ DESCRIPTION = "The Node Manager Proxy provides a simple interface for communicat with Management Engine via IPMB" SRC_URI = "git://git@github.com/Intel-BMC/node-manager;protocol=ssh" -SRCREV = "81133dd32bd0337aec9e026d1c9c2788028c7bdd" +SRCREV = "2ab90332828614c95e0ce22c0c95285734b55b65" PV = "0.1+git${SRCPV}" LICENSE = "Apache-2.0" |