summaryrefslogtreecommitdiff
path: root/meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host
diff options
context:
space:
mode:
authorEd Tanous <ed.tanous@intel.com>2019-04-15 23:42:44 +0300
committerEd Tanous <ed.tanous@intel.com>2019-04-17 19:13:25 +0300
commit816d793003e93c1e5eec0a2e90fbd8b9dde9f7a5 (patch)
tree341534fed9a2de460ded7f8231ca1cbb178bb2ca /meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host
parenta75bff085ba9443315222231c42692745e5781e9 (diff)
downloadopenbmc-816d793003e93c1e5eec0a2e90fbd8b9dde9f7a5.tar.xz
Update 4-15-19
Signed-off-by: Ed Tanous <ed.tanous@intel.com>
Diffstat (limited to 'meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host')
-rw-r--r--meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0009-IPv6-Network-changes.patch198
-rw-r--r--meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0016-add-better-sdbusplus-exception-handling.patch153
-rw-r--r--meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0018-Catch-sdbusplus-exceptions-in-IPMI-net.patch49
-rw-r--r--meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0048-Implement-IPMI-Master-Write-Read-command.patch93
-rw-r--r--meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0051-Fix-Set-LAN-Config-to-work-without-SetInProgress.patch142
-rw-r--r--meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0058-Add-AC-failed-bit-support-for-get-chassis-status-com.patch76
-rw-r--r--meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0059-Move-Set-SOL-config-parameter-to-host-ipmid.patch415
-rw-r--r--meta-openbmc-mods/meta-common/recipes-phosphor/ipmi/phosphor-ipmi-host/0060-Move-Get-SOL-config-parameter-to-host-ipmid.patch248
8 files changed, 894 insertions, 480 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
+