diff options
author | Jason M. Bills <jason.m.bills@linux.intel.com> | 2020-12-08 00:45:20 +0300 |
---|---|---|
committer | Jason M. Bills <jason.m.bills@linux.intel.com> | 2020-12-10 01:15:05 +0300 |
commit | 82dbc15a05125a812c140a3c8cff81c366482229 (patch) | |
tree | 9c8f1ad262a2e281f20340cf8646aca6f8596044 /meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host | |
parent | 8d6ae7f2a817751fad151168fa10ce28ee0869d8 (diff) | |
download | openbmc-82dbc15a05125a812c140a3c8cff81c366482229.tar.xz |
Update to internal 0.26
Signed-off-by: Jason M. Bills <jason.m.bills@linux.intel.com>
Diffstat (limited to 'meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host')
3 files changed, 68 insertions, 293 deletions
diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0001-Modify-Get-Lan-Configuration-IP-Address-Source-to-us.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0001-Modify-Get-Lan-Configuration-IP-Address-Source-to-us.patch deleted file mode 100644 index 7e3f92dbc..000000000 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0001-Modify-Get-Lan-Configuration-IP-Address-Source-to-us.patch +++ /dev/null @@ -1,231 +0,0 @@ -From 8e9fba263179ccc87be7212c7dbd87cd7a37ac30 Mon Sep 17 00:00:00 2001 -From: Johnathan Mantey <johnathanx.mantey@intel.com> -Date: Thu, 14 Nov 2019 11:24:19 -0800 -Subject: [PATCH] Modify Get Lan Configuration IP Address Source to use correct - DBus DHCPEnabled type - -The Get/Set Lan Configuration "IP Address Source" subcommand got -broken by phosphor-dbus-interfaces commit 12162be - -12162be changed the DBus DHCPEnabled type from boolean to enum -type. The Get LAN Configuration IP address Source IPMI command did not -get changed to an enum type prior to 12162be being merged. This commit -retroactively updates the boolean type to enum type. - -Tested: - -ipmitool raw 0xc 2 3 4 0 0 # returns correct state -ipmitool raw 0xc 1 3 4 1 # changes DCHP to Static -ipmitool raw 0xc 1 3 4 2 # returns Static to DHCP - -Assigned a static address via Redfish and tested using: -ipmitool raw 0xc 2 3 4 0 0 # returns correct state - -Returned the NIC to use DHCP via Redfish and tested using: -ipmitool raw 0xc 2 3 4 0 0 # returns correct state - -Change-Id: Ia66f7fcf3d5ad0a383b06658b18e8ce2b282e052 -Signed-off-by: Johnathan Mantey <johnathanx.mantey@intel.com> ---- - transporthandler.cpp | 97 ++++++++++++++++++++++++++++++++++++-------- - 1 file changed, 79 insertions(+), 18 deletions(-) - -diff --git a/transporthandler.cpp b/transporthandler.cpp -index 16ce2b2..ccc2a97 100644 ---- a/transporthandler.cpp -+++ b/transporthandler.cpp -@@ -109,6 +109,18 @@ constexpr auto INTF_NEIGHBOR_CREATE_STATIC = - constexpr auto INTF_VLAN = "xyz.openbmc_project.Network.VLAN"; - constexpr auto INTF_VLAN_CREATE = "xyz.openbmc_project.Network.VLAN.Create"; - -+static constexpr auto dhcpv4v6 = -+ "xyz.openbmc_project.Network.EthernetInterface.DHCPConf.both"; -+static constexpr auto dhcpv6 = -+ "xyz.openbmc_project.Network.EthernetInterface.DHCPConf.v6"; -+static constexpr auto dhcpv4 = -+ "xyz.openbmc_project.Network.EthernetInterface.DHCPConf.v4"; -+static constexpr auto dhcpoff = -+ "xyz.openbmc_project.Network.EthernetInterface.DHCPConf.none"; -+ -+static std::array<const char*, 4> dhcpEnumerations = {dhcpv4v6, dhcpv4, dhcpv6, -+ dhcpoff}; -+ - /** @brief Generic paramters for different address families */ - template <int family> - struct AddrFamily -@@ -456,25 +468,63 @@ auto channelCall(uint8_t channel, Args&&... args) - * - * @param[in] bus - The bus object used for lookups - * @param[in] params - The parameters for the channel -- * @return True if DHCP is enabled, false otherwise -+ * @return string containing an enumerated value -+ * constexpr's dhcpv4v6, dhcpv4, dhcpv6, and dhcpoff - */ --bool getDHCPProperty(sdbusplus::bus::bus& bus, const ChannelParams& params) -+std::string getDHCPProperty(sdbusplus::bus::bus& bus, -+ const ChannelParams& params) - { -- return std::get<bool>(getDbusProperty( -+ return std::get<std::string>(getDbusProperty( - bus, params.service, params.logicalPath, INTF_ETHERNET, "DHCPEnabled")); - } - - /** @brief Sets the system value for DHCP on the given interface - * -- * @param[in] bus - The bus object used for lookups -- * @param[in] params - The parameters for the channel -- * @param[in] on - Whether or not to enable DHCP -+ * @param[in] bus - The bus object used for lookups -+ * @param[in] params - The parameters for the channel -+ * @param[in] setting - DHCP state to assign (none, v4, v6, both) - */ - void setDHCPProperty(sdbusplus::bus::bus& bus, const ChannelParams& params, -- bool on) -+ const std::string& setting) - { -+ auto it = dhcpEnumerations.begin(); -+ while (it != dhcpEnumerations.end()) -+ { -+ if (*it == setting) -+ { -+ break; -+ } -+ it++; -+ } -+ if (it == dhcpEnumerations.end()) -+ { -+ log<level::ERR>("Invalid DHCP setting.", -+ entry("Requested DHCP mode=%s", setting.c_str())); -+ elog<InternalFailure>(); -+ } -+ -+ std::string dhcp = getDHCPProperty(bus, params); -+ std::string nextDhcp{}; -+ -+ if (((dhcp == dhcpv4) && (setting == dhcpv6)) || -+ ((dhcp == dhcpv6) && (setting == dhcpv4))) -+ { -+ // DHCP is enabled independently for IPv4 and IPv6. If IPv4 -+ // DHCP is enabled, and a request to add IPv6 is received, -+ // change the DHCPEnabled enum to "both" active. The same -+ // logic is applied if IPV6 is already enabled, and an IPv4 -+ // enable request is made. -+ nextDhcp = dhcpv4v6; -+ } -+ else -+ { -+ // "both" enabled -> ipv4 only -+ // "both" enabled -> ipv6 only -+ // "ip4v", "ipv6", or "both" enabled -> no DHCP -+ nextDhcp = setting; -+ } - setDbusProperty(bus, params.service, params.logicalPath, INTF_ETHERNET, -- "DHCPEnabled", on); -+ "DHCPEnabled", nextDhcp); - } - - /** @brief Converts a human readable MAC string into MAC bytes -@@ -1113,7 +1163,7 @@ void deconfigureChannel(sdbusplus::bus::bus& bus, ChannelParams& params) - } - - // Clear out any settings on the lower physical interface -- setDHCPProperty(bus, params, false); -+ setDHCPProperty(bus, params, dhcpoff); - } - - /** @brief Creates a new VLAN on the specified interface -@@ -1401,7 +1451,8 @@ RspType<> setLan(uint4_t channelBits, uint4_t, uint8_t parameter, - } - case LanParam::IP: - { -- if (channelCall<getDHCPProperty>(channel)) -+ std::string dhcpSetting = channelCall<getDHCPProperty>(channel); -+ if ((dhcpSetting == dhcpv4) || (dhcpSetting == dhcpv4v6)) - { - return responseCommandNotAvailable(); - } -@@ -1431,7 +1482,11 @@ RspType<> setLan(uint4_t channelBits, uint4_t, uint8_t parameter, - { - case IPSrc::DHCP: - { -- channelCall<setDHCPProperty>(channel, true); -+ // The IPSrc IPMI command is only for IPv4 -+ // management. Modifying IPv6 state is done using -+ // a completely different Set LAN Configuration -+ // subcommand. -+ channelCall<setDHCPProperty>(channel, dhcpv4); - return responseSuccess(); - } - case IPSrc::Unspecified: -@@ -1439,7 +1494,7 @@ RspType<> setLan(uint4_t channelBits, uint4_t, uint8_t parameter, - case IPSrc::BIOS: - case IPSrc::BMC: - { -- channelCall<setDHCPProperty>(channel, false); -+ channelCall<setDHCPProperty>(channel, dhcpoff); - return responseSuccess(); - } - } -@@ -1464,7 +1519,8 @@ RspType<> setLan(uint4_t channelBits, uint4_t, uint8_t parameter, - } - case LanParam::SubnetMask: - { -- if (channelCall<getDHCPProperty>(channel)) -+ std::string dhcpSetting = channelCall<getDHCPProperty>(channel); -+ if ((dhcpSetting == dhcpv4) || (dhcpSetting == dhcpv4v6)) - { - return responseCommandNotAvailable(); - } -@@ -1481,7 +1537,8 @@ RspType<> setLan(uint4_t channelBits, uint4_t, uint8_t parameter, - } - case LanParam::Gateway1: - { -- if (channelCall<getDHCPProperty>(channel)) -+ std::string dhcpSetting = channelCall<getDHCPProperty>(channel); -+ if ((dhcpSetting == dhcpv4) || (dhcpSetting == dhcpv4v6)) - { - return responseCommandNotAvailable(); - } -@@ -1606,7 +1663,8 @@ RspType<> setLan(uint4_t channelBits, uint4_t, uint8_t parameter, - return responseReqDataLenInvalid(); - } - std::bitset<8> expected; -- if (channelCall<getDHCPProperty>(channel)) -+ std::string dhcp = channelCall<getDHCPProperty>(channel); -+ if ((dhcp == dhcpv4v6) || (dhcp == dhcpv6)) - { - expected[IPv6RouterControlFlag::Dynamic] = 1; - } -@@ -1756,7 +1814,8 @@ RspType<message::Payload> getLan(uint4_t channelBits, uint3_t, bool revOnly, - case LanParam::IPSrc: - { - auto src = IPSrc::Static; -- if (channelCall<getDHCPProperty>(channel)) -+ std::string dhcp = channelCall<getDHCPProperty>(channel); -+ if ((dhcp == dhcpv4) || (dhcp == dhcpv4v6)) - { - src = IPSrc::DHCP; - } -@@ -1877,7 +1936,8 @@ RspType<message::Payload> getLan(uint4_t channelBits, uint3_t, bool revOnly, - case LanParam::IPv6RouterControl: - { - std::bitset<8> control; -- if (channelCall<getDHCPProperty>(channel)) -+ std::string dhcp = channelCall<getDHCPProperty>(channel); -+ if ((dhcp == dhcpv4v6) || (dhcp == dhcpv6)) - { - control[IPv6RouterControlFlag::Dynamic] = 1; - } -@@ -1891,7 +1951,8 @@ RspType<message::Payload> getLan(uint4_t channelBits, uint3_t, bool revOnly, - case LanParam::IPv6StaticRouter1IP: - { - in6_addr gateway{}; -- if (!channelCall<getDHCPProperty>(channel)) -+ std::string dhcp = channelCall<getDHCPProperty>(channel); -+ if ((dhcp == dhcpv4) || (dhcp == dhcpoff)) - { - gateway = - channelCall<getGatewayProperty<AF_INET6>>(channel).value_or( --- -2.24.1 - diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0053-Fix-keep-looping-issue-when-entering-OS.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0053-Fix-keep-looping-issue-when-entering-OS.patch index 903ae96a7..7a7fd0859 100644 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0053-Fix-keep-looping-issue-when-entering-OS.patch +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0053-Fix-keep-looping-issue-when-entering-OS.patch @@ -23,7 +23,7 @@ diff --git a/host-cmd-manager.cpp b/host-cmd-manager.cpp index f3aba7f..465eb81 100644 --- a/host-cmd-manager.cpp +++ b/host-cmd-manager.cpp -@@ -26,6 +26,8 @@ constexpr auto MAPPER_INTERFACE = "xyz.openbmc_project.ObjectMapper"; +@@ -23,6 +23,8 @@ namespace command constexpr auto HOST_STATE_PATH = "/xyz/openbmc_project/state/host0"; constexpr auto HOST_STATE_INTERFACE = "xyz.openbmc_project.State.Host"; constexpr auto HOST_TRANS_PROP = "RequestedHostTransition"; @@ -32,7 +32,7 @@ index f3aba7f..465eb81 100644 // For throwing exceptions using namespace phosphor::logging; -@@ -106,6 +108,20 @@ void Manager::clearQueue() +@@ -103,6 +105,20 @@ void Manager::clearQueue() // `false` indicating Failure std::get<CallBack>(command)(ipmiCmdData, false); } @@ -53,28 +53,37 @@ index f3aba7f..465eb81 100644 } // Called for alerting the host -@@ -115,9 +131,6 @@ void Manager::checkQueueAndAlertHost() +@@ -112,9 +128,7 @@ void Manager::checkQueueAndAlertHost() { log<level::DEBUG>("Asserting SMS Attention"); +- std::string HOST_IPMI_SVC("org.openbmc.HostIpmi"); - std::string IPMI_PATH("/org/openbmc/HostIpmi/1"); - std::string IPMI_INTERFACE("org.openbmc.HostIpmi"); -- - auto host = ::ipmi::getService(this->bus, IPMI_INTERFACE, IPMI_PATH); ++ auto host = ::ipmi::getService(this->bus, IPMI_INTERFACE, IPMI_PATH); // Start the timer for this transaction -@@ -131,9 +144,8 @@ void Manager::checkQueueAndAlertHost() + auto time = std::chrono::duration_cast<std::chrono::microseconds>( +@@ -127,12 +141,13 @@ void Manager::checkQueueAndAlertHost() return; } - auto method = -- this->bus.new_method_call(host.c_str(), IPMI_PATH.c_str(), +- this->bus.new_method_call(HOST_IPMI_SVC.c_str(), IPMI_PATH.c_str(), - IPMI_INTERFACE.c_str(), "setAttention"); +- auto reply = this->bus.call(method); +- +- if (reply.is_method_error()) + auto method = this->bus.new_method_call(host.c_str(), IPMI_PATH, + IPMI_INTERFACE, "setAttention"); - auto reply = this->bus.call(method); - - if (reply.is_method_error()) ++ try ++ { ++ auto reply = this->bus.call(method); ++ } ++ catch (const std::exception&) + { + log<level::ERR>("Error in setting SMS attention"); + elog<InternalFailure>(); -- 2.7.4 diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0056-add-SetInProgress-to-get-set-boot-option-cmd.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0056-add-SetInProgress-to-get-set-boot-option-cmd.patch index 987e61448..862e9baa8 100644 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0056-add-SetInProgress-to-get-set-boot-option-cmd.patch +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0056-add-SetInProgress-to-get-set-boot-option-cmd.patch @@ -1,79 +1,76 @@ -From f9f260391f099b4e67999f9d4ca05cbf9b422baf Mon Sep 17 00:00:00 2001 -From: "Jia, chunhui" <chunhui.jia@linux.intel.com> -Date: Tue, 19 Mar 2019 16:09:06 +0800 -Subject: [PATCH] add SetInProgress to get/set boot option cmd +From d5cfc5a0aaa50cc94054886e5cb7be25ef167c71 Mon Sep 17 00:00:00 2001 +From: huanghe <he.huang@intel.com> +Date: Sat, 10 Oct 2020 14:40:00 +0800 +Subject: [PATCH 7/7] Add set in progress paramter to set/get boot option + command -It is required by BIOS. BIOS will check setinprogress first. -If this flag is not supported, BIOS will bypass all boot -option flow. - -Change-Id: Ibb0501ea5bc36c4f1f72339efef03724dd4e613f -Signed-off-by: Jia, chunhui <chunhui.jia@linux.intel.com> -Signed-off-by: Yong Li <yong.b.li@linux.intel.com> +Signed-off-by: huanghe <he.huang@intel.com> --- - chassishandler.cpp | 28 +++++++++++++++++++++++++++- + chassishandler.cpp | 34 ++++++++++++++++++++++++++++++++++ chassishandler.hpp | 3 +++ - 2 files changed, 30 insertions(+), 1 deletion(-) + 2 files changed, 37 insertions(+) diff --git a/chassishandler.cpp b/chassishandler.cpp -index 305897b..ee23845 100644 +index f043340..322aa9e 100644 --- a/chassishandler.cpp +++ b/chassishandler.cpp -@@ -1399,6 +1399,10 @@ static ipmi_ret_t setBootMode(const Mode::Modes& mode) - return IPMI_CC_OK; +@@ -1564,6 +1564,10 @@ static ipmi::Cc setBootMode(const Mode::Modes& mode) + return ipmi::ccSuccess; } +static constexpr uint8_t setComplete = 0x0; +static constexpr uint8_t setInProgress = 0x1; +static uint8_t transferStatus = setComplete; + - ipmi_ret_t ipmi_chassis_get_sys_boot_options(ipmi_netfn_t netfn, ipmi_cmd_t cmd, - ipmi_request_t request, - ipmi_response_t response, -@@ -1413,11 +1417,21 @@ ipmi_ret_t ipmi_chassis_get_sys_boot_options(ipmi_netfn_t netfn, ipmi_cmd_t cmd, - get_sys_boot_options_t* reqptr = (get_sys_boot_options_t*)request; + /** @brief implements the Get Chassis system boot option + * @param bootOptionParameter - boot option parameter selector + * @param reserved1 - reserved bit +@@ -1598,6 +1602,14 @@ ipmi::RspType<ipmi::message::Payload> + IpmiValue bootOption = ipmiDefault; -+ if (reqptr->parameter == -+ static_cast<uint8_t>(BootOptionParameter::SET_IN_PROGRESS)) ++ ++ if (static_cast<uint8_t>(bootOptionParameter) == ++ static_cast<uint8_t>(BootOptionParameter::setInProgress)) + { -+ *data_len = -+ static_cast<uint8_t>(BootOptionResponseSize::SET_IN_PROGRESS); -+ resp->version = SET_PARM_VERSION; -+ resp->parm = static_cast<uint8_t>(BootOptionParameter::SET_IN_PROGRESS); -+ resp->data[0] = transferStatus; -+ return IPMI_CC_OK; ++ response.pack(bootOptionParameter,reserved1,transferStatus); ++ return ipmi::responseSuccess(std::move(response)); + } + - std::memset(resp, 0, sizeof(*resp)); - resp->version = SET_PARM_VERSION; - resp->parm = 5; - resp->data[0] = SET_PARM_BOOT_FLAGS_VALID_ONE_TIME; -- /* * Parameter #5 means boot flags. Please refer to 28.13 of ipmi doc. * This is the only parameter used by petitboot. -@@ -1553,6 +1567,18 @@ ipmi_ret_t ipmi_chassis_set_sys_boot_options(ipmi_netfn_t netfn, ipmi_cmd_t cmd, - // This IPMI command does not have any resposne data - *data_len = 0; +@@ -1719,6 +1731,28 @@ ipmi::RspType<> ipmiChassisSetSysBootOptions(ipmi::Context::ptr ctx, + using namespace boot_options; + ipmi::Cc rc; -+ if (reqptr->parameter == -+ static_cast<uint8_t>(BootOptionParameter::SET_IN_PROGRESS)) ++ if (parameterSelector == ++ static_cast<uint7_t>(BootOptionParameter::setInProgress)) + { ++ uint2_t setInProgressFlag; ++ uint6_t rsvd; ++ if (data.unpack(setInProgressFlag,rsvd) != 0 || ++ !data.fullyUnpacked()) ++ { ++ return ipmi::responseReqDataLenInvalid(); ++ } ++ if (rsvd) ++ { ++ return ipmi::responseInvalidFieldRequest(); ++ } + if ((transferStatus == setInProgress) && -+ (reqptr->data[0] != setComplete)) ++ ((uint8_t)setInProgressFlag != setComplete)) + { -+ return IPMI_CC_FAIL_SET_IN_PROGRESS; ++ return ipmi::response(IPMI_CC_FAIL_SET_IN_PROGRESS); + } -+ transferStatus = reqptr->data[0]; -+ return IPMI_CC_OK; ++ transferStatus = (uint8_t)setInProgressFlag; + } + /* 000101 * Parameter #5 means boot flags. Please refer to 28.13 of ipmi doc. * This is the only parameter used by petitboot. diff --git a/chassishandler.hpp b/chassishandler.hpp -index dcaf06c..353a929 100644 +index 93de2c0..5976abc 100644 --- a/chassishandler.hpp +++ b/chassishandler.hpp @@ -25,6 +25,7 @@ enum ipmi_chassis_return_codes @@ -88,18 +85,18 @@ index dcaf06c..353a929 100644 }; enum class BootOptionParameter : size_t { -+ SET_IN_PROGRESS = 0x0, - BOOT_INFO = 0x4, - BOOT_FLAGS = 0x5, - OPAL_NETWORK_SETTINGS = 0x61 ++ setInProgress= 0x0, + bootInfo = 0x4, + bootFlags = 0x5, + opalNetworkSettings = 0x61 @@ -53,6 +55,7 @@ enum class BootOptionParameter : size_t enum class BootOptionResponseSize : size_t { -+ SET_IN_PROGRESS = 3, - BOOT_FLAGS = 5, - OPAL_NETWORK_SETTINGS = 50 ++ setInProgress = 3, + bootFlags = 5, + opalNetworkSettings = 50 }; -- -2.7.4 +2.17.1 |