From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM10-DM6-obe.outbound.protection.outlook.com (NAM10-DM6-obe.outbound.protection.outlook.com [40.107.93.75]) by mx.groups.io with SMTP id smtpd.web10.2720.1681802176407961628 for ; Tue, 18 Apr 2023 00:16:16 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="body hash did not verify" header.i=@amd.com header.s=selector1 header.b=ZnRMYpNJ; spf=permerror, err=parse error for token &{10 18 %{i}._ip.%{h}._ehlo.%{d}._spf.vali.email}: invalid domain name (domain: amd.com, ip: 40.107.93.75, mailfrom: abner.chang@amd.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=nSRoXa5XC/bOUZla/XvOfn/LeAHFxsOZqYvQuEbDU0Ft9zgR/nwSZZ0XtTB0GGzeAjK5fH96eZzOrsUO7nlhxCSBXSHiFS3bVo/2wJdtDvpy6hAwOtmo3+8YqeTpQPwJ17SbRT7amVq0FfAf+71h1d/5upOHfUyZj+YuqQ/6MuD5QWJvqCFCE72u/e6AZ7pi08KEY9y/8wR+gyGXvvVpydE9rLpfRJv2Xd+d5OhN6YeVyz1B9XpUGJk/jjkJLhjgtgky2E+5phaLuNrQc8V0K4l0J6S+XPLZqUNjBR0Uw1UNEjFfBxMAbopPoA5Avy5plSBcUs/AFszlzun0rBTedg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=D+iD9vE9NPfn87N0FdnjyA9GT9v3fqZ7giwYD3T5Dbk=; b=UrnM7n9uJQcvrdHFw+8q1wlTZUvbGZRh1xCcYTIkvNywWu3zLLbHltNz1b1PDpVVNuHwlAoSEd8TZv/EAa49Kk+LCnyebf/z9j7L246oA5yeiMpuRjfvmREQtTc8Je1YEgI5JARl1OylejbE9wL9qHEzy82voP4Xmbm/zfD+t7s+QC7GvgTGzyxlTulz83IR9MoqQ1WRJXKa/qOStu7iB3HXOMToZxbfV4o1TzGaPJIhLjhzaiIZgdH3W/FgF0WczuKpCjX73jnMiYYPiw1BxMqAz3gEqqKwqoof7kRSvwhDe/MCkAjhGlhdPJoWPB7PyA0xVM3WyJ7nJeSUUI7gqA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=edk2.groups.io smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=D+iD9vE9NPfn87N0FdnjyA9GT9v3fqZ7giwYD3T5Dbk=; b=ZnRMYpNJyUH/AdY2HfIuHTmIV+xEAYlIejDTHi9BFvs4EFsfoeWhV+vanSjUOm8NaM1wl3Db1ah7aPOm1ckIhx5yXFSbWF5N1CN8Xr8o7OUzAGIkWLmYtX1NxdfT2zxVVjHZd04A19/M0y0wQTw1uFJKEqKaPWxYKpH4JzSvNM8= Received: from DM6PR01CA0004.prod.exchangelabs.com (2603:10b6:5:296::9) by SJ2PR12MB7847.namprd12.prod.outlook.com (2603:10b6:a03:4d2::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6298.45; Tue, 18 Apr 2023 07:16:13 +0000 Received: from DM6NAM11FT029.eop-nam11.prod.protection.outlook.com (2603:10b6:5:296:cafe::a6) by DM6PR01CA0004.outlook.office365.com (2603:10b6:5:296::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6298.47 via Frontend Transport; Tue, 18 Apr 2023 07:16:13 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by DM6NAM11FT029.mail.protection.outlook.com (10.13.173.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.6319.20 via Frontend Transport; Tue, 18 Apr 2023 07:16:13 +0000 Received: from TPE-L1-ABNCHANG.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.34; Tue, 18 Apr 2023 02:16:08 -0500 From: "Chang, Abner" To: CC: Isaac Oram , Abdul Lateef Attar , Nickle Wang , Igor Kulchytskyy Subject: [edk2-platforms][PATCH V2 03/14] ManageabilityPkg: Add HeaderSize and TrailerSize Date: Tue, 18 Apr 2023 15:15:32 +0800 Message-ID: <20230418071543.1951-4-abner.chang@amd.com> X-Mailer: git-send-email 2.37.1.windows.1 In-Reply-To: <20230418071543.1951-1-abner.chang@amd.com> References: <20230418071543.1951-1-abner.chang@amd.com> MIME-Version: 1.0 Return-Path: Abner.Chang@amd.com X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB03.amd.com (10.181.40.144) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM6NAM11FT029:EE_|SJ2PR12MB7847:EE_ X-MS-Office365-Filtering-Correlation-Id: 957b697f-3d56-492a-0627-08db3fdccb04 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: e1Rekm1I1Mij7d93YGPXfhBcgUbFmtLtrJPm+fap2nUMxLJ64VmCDDvpiavhBAPoDEYLcI+mhM1LhypwghVOGa6CDDc8Pxm8kO8wMm/VNVuSaTpLfT1vBRFXZfZV8394m4qekV0MEYg8gGZba/KC3pYZmhOTD+aazkJZn28IcgRkDzZEmcqV4AXdMm6D26C3IY3IDx3RbNchjbXmSWPCgq/Jqj0r146rUTF230kXhyJPyKBqPvBXBcvKyy/GTBw65bvhXajor/HFth/1hvUv1WbsBM1/fJGr7v4/hUampvZVzpS66ZaturYvHPiuBKYLa+UN2EfJ6Q6WJOLwwa7hX5pDlXxe2sy6aCwyO/jEm9FKyRjCMfYlECM/XJjHTRtDbkHMiq4wKQp+xmefy4cEBJCOs6eYl/xNHonIuWkx8tuSrARysXAvxacrq450Kx2nQSet1Ojx3JuRGJMgZhRgbyHdjwBmRhuGZayM/1zvF9DfjKR6DKFz1nGSffCfHAgKiYREXHFuF4I/R8Oe91t2RC1SpsHv+3SkcBmlJ+h+mv1Y0ghPF7Mtf1Zk/abPUqN64Ad4VEAa0FRccqEMs48qE13C1Ejo70W/8egBS2ZDXOTDkJb0No+YrrUpFGnadJB9TE1fj3Fy0r/mybUAGk3NxOihSfxJhEJBtFO9K3fZdi6Vzv/XUBk5AtR77YeHJ0c55pyhfv7RpiDP6jSbvN9Fi7h/624ot5Tm63vE00y3xeE= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230028)(4636009)(136003)(376002)(346002)(396003)(39860400002)(451199021)(46966006)(36840700001)(40470700004)(426003)(336012)(47076005)(83380400001)(36860700001)(2616005)(478600001)(7696005)(6666004)(16526019)(316002)(1076003)(26005)(186003)(54906003)(2876002)(2906002)(30864003)(36756003)(40460700003)(5660300002)(70206006)(70586007)(81166007)(356005)(4326008)(82740400003)(6916009)(82310400005)(41300700001)(8936002)(8676002)(86362001)(40480700001)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Apr 2023 07:16:13.3513 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 957b697f-3d56-492a-0627-08db3fdccb04 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: DM6NAM11FT029.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ2PR12MB7847 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain From: Abner Chang Add HeaderSize and TrailerSize in MANAGEABILITY_TRANSFER_TOKEN structure. Manageability transport interface may used by multiple protocols which have different header and trailer of payload. (e.g. MCTP over KCS and IPMI over KCS). Signed-off-by: Abner Chang Cc: Isaac Oram Cc: Abdul Lateef Attar Cc: Nickle Wang Cc: Igor Kulchytskyy --- .../Library/ManageabilityTransportLib.h | 2 + .../Common/ManageabilityTransportKcs.h | 20 ++- .../IpmiProtocol/Common/IpmiProtocolCommon.h | 36 +++-- .../Common/KcsCommon.c | 152 ++++++++++++------ .../Dxe/ManageabilityTransportKcs.c | 14 +- .../IpmiProtocol/Common/IpmiProtocolCommon.c | 63 +++++--- Features/ManageabilityPkg/Readme.md | 10 ++ 7 files changed, 194 insertions(+), 103 deletions(-) diff --git a/Features/ManageabilityPkg/Include/Library/ManageabilityTranspo= rtLib.h b/Features/ManageabilityPkg/Include/Library/ManageabilityTransportL= ib.h index d86d0d87d5..04072aee89 100644 --- a/Features/ManageabilityPkg/Include/Library/ManageabilityTransportLib.h +++ b/Features/ManageabilityPkg/Include/Library/ManageabilityTransportLib.h @@ -168,10 +168,12 @@ struct _MANAGEABILITY_TRANSFER_TOKEN { = ///< which is sent discretely of payload. = ///< This field can be NULL if the transport = ///< doesn't require this. + UINT16 TransmitHeaderSize; = ///< Transmit header size in byte. MANAGEABILITY_TRANSPORT_TRAILER TransmitTrailer; = ///< This is the transport-specific trailer = ///< which is sent discretely of payload. = ///< This field can be NULL if the transport = ///< doesn't require this. + UINT16 TransmitTrailerSize; = ///< Transmit trailer size in byte. MANAGEABILITY_TRANSMIT_PACKAGE TransmitPackage; = ///< The payload sent to transport interface. MANAGEABILITY_RECEIVE_PACKAGE ReceivePackage; = ///< The buffer to receive the response. EFI_STATUS TransferStatus; = ///< The EFI Status of the transfer. diff --git a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib= /Common/ManageabilityTransportKcs.h b/Features/ManageabilityPkg/Library/Man= ageabilityTransportKcsLib/Common/ManageabilityTransportKcs.h index 2cdf60ba7e..d6685c165e 100644 --- a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common= /ManageabilityTransportKcs.h +++ b/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common= /ManageabilityTransportKcs.h @@ -41,8 +41,10 @@ typedef struct { /** This service communicates with BMC using KCS protocol. =20 - @param[in] NetFunction Net function of the command. - @param[in] Command IPMI Command. + @param[in] TransmitHeader KCS packet header. + @param[in] TransmitHeaderSize KCS packet header size in byte. + @param[in] TransmitTrailer KCS packet trailer. + @param[in] TransmitTrailerSize KCS packet trailer size in byte. @param[in] RequestData Command Request Data. @param[in] RequestDataSize Size of Command Request Data. @param[out] ResponseData Command Response Data. The complet= ion @@ -69,12 +71,14 @@ typedef struct { EFI_STATUS EFIAPI KcsTransportSendCommand ( - IN UINT8 NetFunction, - IN UINT8 Command, - IN UINT8 *RequestData OPTIONAL, - IN UINT32 RequestDataSize, - OUT UINT8 *ResponseData OPTIONAL, - IN OUT UINT32 *ResponseDataSize OPTIONAL + IN MANAGEABILITY_TRANSPORT_HEADER TransmitHeader, + IN UINT16 TransmitHeaderSize, + IN MANAGEABILITY_TRANSPORT_TRAILER TransmitTrailer OPTIONAL, + IN UINT16 TransmitTrailerSize, + IN UINT8 *RequestData OPTIONAL, + IN UINT32 RequestDataSize, + OUT UINT8 *ResponseData OPTIONAL, + IN OUT UINT32 *ResponseDataSize OPTIONAL ); =20 /** diff --git a/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiPr= otocolCommon.h b/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/Ip= miProtocolCommon.h index 5a7236e9a6..8bf16e6277 100644 --- a/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtocolC= ommon.h +++ b/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtocolC= ommon.h @@ -44,21 +44,23 @@ SetupIpmiTransportHardwareInformation ( This functions setup the final header/body/trailer packets for the acquired transport interface. =20 - @param[in] TransportToken The transport interface. - @param[in] NetFunction IPMI function. - @param[in] Command IPMI command. - @param[out] PacketHeader The pointer to receive header of requ= est. - @param[in, out] PacketBody The request body. - When IN, it is the caller's request b= ody. - When OUT and NULL, the request body i= s not - changed. - Whee out and non-NULL, the request bo= dy is - changed to comfort the transport inte= rface. - @param[in, out] PacketBodySize The request body size. - When IN and non-zero, it is the new d= ata - length of request body. - When IN and zero, the request body is= unchanged. - @param[out] PacketTrailer The pointer to receive trailer of req= uest. + @param[in] TransportToken The transport interface. + @param[in] NetFunction IPMI function. + @param[in] Command IPMI command. + @param[out] PacketHeader The pointer to receive header of r= equest. + @param[out] PacketHeaderSize Pinter to receive packet header si= ze in byte. + @param[in, out] PacketBody The request body. + When IN, it is the caller's reques= t body. + When OUT and NULL, the request bod= y is not + changed. + Whee out and non-NULL, the request= body is + changed to comfort the transport i= nterface. + @param[in, out] PacketBodySize The request body size. + When IN and non-zero, it is the ne= w data + length of request body. + When IN and zero, the request body= is unchanged. + @param[out] PacketTrailer The pointer to receive trailer of = request. + @param[out] PacketTrailerSize Pinter to receive packet trailer s= ize in byte. =20 @retval EFI_SUCCESS Request packet is returned. @retval EFI_UNSUPPORTED Request packet is not returned because @@ -70,9 +72,11 @@ SetupIpmiRequestTransportPacket ( IN UINT8 NetFunction, IN UINT8 Command, OUT MANAGEABILITY_TRANSPORT_HEADER *PacketHeader OPTIONAL, + OUT UINT16 *PacketHeaderSize, IN OUT UINT8 **PacketBody OPTIONAL, IN OUT UINT32 *PacketBodySize OPTIONAL, - OUT MANAGEABILITY_TRANSPORT_TRAILER *PacketTrailer OPTIONAL + OUT MANAGEABILITY_TRANSPORT_TRAILER *PacketTrailer OPTIONAL, + OUT UINT16 *PacketTrailerSize ); =20 /** diff --git a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib= /Common/KcsCommon.c b/Features/ManageabilityPkg/Library/ManageabilityTransp= ortKcsLib/Common/KcsCommon.c index 17e2b8f231..14a7047447 100644 --- a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common= /KcsCommon.c +++ b/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common= /KcsCommon.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include =20 @@ -98,8 +99,10 @@ ClearOBF ( Algorithm is based on flow chart provided in IPMI spec 2.0 Figure 9-6, KCS Interface BMC to SMS Write Transfer Flow Chart =20 - @param[in] NetFunction Net function of the command. - @param[in] Command IPMI Command. + @param[in] TransmitHeader KCS packet header. + @param[in] TransmitHeaderSize KCS packet header size in byte. + @param[in] TransmitTrailer KCS packet trailer. + @param[in] TransmitTrailerSize KCS packet trailer size in byte. @param[in] RequestData Command Request Data, could be NULL. RequestDataSize must be zero, if Reque= stData is NULL. @@ -122,10 +125,12 @@ ClearOBF ( **/ EFI_STATUS KcsTransportWrite ( - IN UINT8 NetFunction, - IN UINT8 Command, - IN UINT8 *RequestData OPTIONAL, - IN UINT32 RequestDataSize + IN MANAGEABILITY_TRANSPORT_HEADER TransmitHeader, + IN UINT16 TransmitHeaderSize, + IN MANAGEABILITY_TRANSPORT_TRAILER TransmitTrailer OPTIONAL, + IN UINT16 TransmitTrailerSize, + IN UINT8 *RequestData OPTIONAL, + IN UINT32 RequestDataSize ) { EFI_STATUS Status; @@ -134,37 +139,63 @@ KcsTransportWrite ( UINT8 *BufferPtr; =20 // Validation on RequestData and RequestDataSize. - if ((RequestData =3D=3D NULL && RequestDataSize !=3D 0) || - (RequestData !=3D NULL && RequestDataSize =3D=3D 0) - ) { + if (((RequestData =3D=3D NULL) && (RequestDataSize !=3D 0)) || + ((RequestData !=3D NULL) && (RequestDataSize =3D=3D 0)) + ) + { DEBUG ((DEBUG_ERROR, "%a: Mismatched values of RequestData or RequestD= ataSize.\n", __FUNCTION__)); return EFI_INVALID_PARAMETER; } =20 - Length =3D sizeof (NetFunction) + sizeof (Command); + // Validation on TransmitHeader and TransmitHeaderSize. + if (((TransmitHeader =3D=3D NULL) && (TransmitHeaderSize !=3D 0)) || + ((TransmitHeader !=3D NULL) && (TransmitHeaderSize =3D=3D 0)) + ) + { + DEBUG ((DEBUG_ERROR, "%a: Mismatched values of TransmitHeader or Trans= mitHeaderSize.\n", __FUNCTION__)); + return EFI_INVALID_PARAMETER; + } + + // Validation on TransmitHeader and TransmitHeaderSize. + if (((TransmitTrailer =3D=3D NULL) && (TransmitTrailerSize !=3D 0)) || + ((TransmitTrailer !=3D NULL) && (TransmitTrailerSize =3D=3D 0)) + ) + { + DEBUG ((DEBUG_ERROR, "%a: Mismatched values of TransmitTrailer or Tran= smitTrailerSize.\n", __FUNCTION__)); + return EFI_INVALID_PARAMETER; + } + + Length =3D TransmitHeaderSize; if (RequestData !=3D NULL) { Length =3D Length + RequestDataSize; } =20 + if ((TransmitTrailer !=3D NULL) && (TransmitTrailerSize !=3D 0)) { + Length +=3D TransmitTrailerSize; + } + Buffer =3D AllocateZeroPool (Length); if (Buffer =3D=3D NULL) { return EFI_OUT_OF_RESOURCES; } =20 // - // Buffer[0] =3D NetFunction - // Buffer[1] =3D Command - // Buffer [2..RequestDataSize] =3D RequestData + // Buffer[0..(TransmitHeaderSize - 1)] =3D TransmitHeader + // Buffer [TransmitHeader..(TransmitHeader + RequestDataSize - 1)] =3D R= equestData + // Buffer [(TransmitHeader + RequestDataSize)..(TransmitHeader + Request= DataSize + TransmitTrailerSize - 1)] =3D TransmitTrailer // BufferPtr =3D Buffer; - CopyMem (BufferPtr, &NetFunction, sizeof (NetFunction)); - BufferPtr +=3D sizeof (NetFunction); - CopyMem (BufferPtr, &Command, sizeof (Command)); - BufferPtr +=3D sizeof (Command); - if (Length > (sizeof (NetFunction) + sizeof (Command))) { + CopyMem ((VOID *)BufferPtr, (VOID *)TransmitHeader, TransmitHeaderSize); + BufferPtr +=3D TransmitHeaderSize; + if (RequestData !=3D NULL) { CopyMem (BufferPtr, RequestData, RequestDataSize); } =20 + BufferPtr +=3D RequestDataSize; + if (TransmitTrailer !=3D NULL) { + CopyMem (BufferPtr, (VOID *)TransmitTrailer, TransmitTrailerSize); + } + BufferPtr =3D Buffer; =20 // Step 1. wait for IBF to get clear @@ -293,10 +324,11 @@ KcsTransportRead ( EFI_STATUS Status; UINT32 ReadLength; =20 - if (DataByte =3D=3D NULL || *Length =3D=3D 0) { + if ((DataByte =3D=3D NULL) || (*Length =3D=3D 0)) { DEBUG ((DEBUG_ERROR, "%a: Either DataByte is NULL or Length is 0.\n", = __FUNCTION__)); return EFI_INVALID_PARAMETER; } + ReadLength =3D 0; while (ReadLength < *Length) { // Step 1. wait for IBF to get clear @@ -350,8 +382,10 @@ KcsTransportRead ( /** This service communicates with BMC using KCS protocol. =20 - @param[in] NetFunction Net function of the command. - @param[in] Command IPMI Command. + @param[in] TransmitHeader KCS packet header. + @param[in] TransmitHeaderSize KCS packet header size in byte. + @param[in] TransmitTrailer KCS packet trailer. + @param[in] TransmitTrailerSize KCS packet trailer size in byte. @param[in] RequestData Command Request Data. @param[in] RequestDataSize Size of Command Request Data. @param[out] ResponseData Command Response Data. The complet= ion @@ -380,12 +414,14 @@ KcsTransportRead ( EFI_STATUS EFIAPI KcsTransportSendCommand ( - IN UINT8 NetFunction, - IN UINT8 Command, - IN UINT8 *RequestData OPTIONAL, - IN UINT32 RequestDataSize, - OUT UINT8 *ResponseData OPTIONAL, - IN OUT UINT32 *ResponseDataSize OPTIONAL + IN MANAGEABILITY_TRANSPORT_HEADER TransmitHeader, + IN UINT16 TransmitHeaderSize, + IN MANAGEABILITY_TRANSPORT_TRAILER TransmitTrailer OPTIONAL, + IN UINT16 TransmitTrailerSize, + IN UINT8 *RequestData OPTIONAL, + IN UINT32 RequestDataSize, + OUT UINT8 *ResponseData OPTIONAL, + IN OUT UINT32 *ResponseDataSize OPTIONAL ) { EFI_STATUS Status; @@ -393,30 +429,41 @@ KcsTransportSendCommand ( IPMI_KCS_RESPONSE_HEADER RspHeader; =20 if ((RequestData !=3D NULL) && (RequestDataSize =3D=3D 0)) { - DEBUG((DEBUG_ERROR, "%a: Mismatched values of RequestData and RequestD= ataSize\n", __FUNCTION__)); + DEBUG ((DEBUG_ERROR, "%a: Mismatched values of RequestData and Request= DataSize\n", __FUNCTION__)); return EFI_INVALID_PARAMETER; } =20 if ((ResponseData !=3D NULL) && ((ResponseDataSize !=3D NULL) && (*Respo= nseDataSize =3D=3D 0))) { - DEBUG((DEBUG_ERROR, "%a: Mismatched values of ResponseData and Respons= eDataSize\n", __FUNCTION__)); + DEBUG ((DEBUG_ERROR, "%a: Mismatched values of ResponseData and Respon= seDataSize\n", __FUNCTION__)); + return EFI_INVALID_PARAMETER; + } + + if (TransmitHeader =3D=3D NULL) { + DEBUG ((DEBUG_ERROR, "%a: TransmitHeader is NULL\n", __FUNCTION__)); return EFI_INVALID_PARAMETER; } =20 + // + // Print out the request payloads. + HelperManageabilityDebugPrint ((VOID *)TransmitHeader, TransmitHeaderSiz= e, "KCS Transmit Header:\n"); + if (RequestData !=3D NULL) { + HelperManageabilityDebugPrint ((VOID *)RequestData, RequestDataSize, "= KCS Request Data:\n"); + } + + if (TransmitTrailer !=3D NULL) { + HelperManageabilityDebugPrint ((VOID *)TransmitTrailer, TransmitTraile= rSize, "KCS Transmit Trailer:\n"); + } + Status =3D KcsTransportWrite ( - (NetFunction << 2), - Command, + TransmitHeader, + TransmitHeaderSize, + TransmitTrailer, + TransmitTrailerSize, RequestData, RequestDataSize ); if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "IPMI KCS Write Failed with Status(%r) for NetFunction(0x%x)," \ - " Command(0x%x).\n", - Status, - NetFunction, - Command - )); + DEBUG ((DEBUG_ERROR, "IPMI KCS Write Failed with Status(%r)", Status))= ; return Status; } =20 @@ -429,7 +476,7 @@ KcsTransportSendCommand ( DEBUG_ERROR, "IPMI KCS read response header failed Status(%r), " \ "RspNetFunctionLun =3D 0x%x, " \ - "Comamnd =3D 0x%x \n", + "Command =3D 0x%x \n", Status, RspHeader.NetFunc, RspHeader.Command @@ -437,16 +484,21 @@ KcsTransportSendCommand ( return (Status); } =20 - Status =3D KcsTransportRead ((UINT8 *)ResponseData, ResponseDataSize); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "IPMI KCS response read Failed with Status(%r) for NetFunction(0x%x)= ," \ - " Command(0x%x).\n", - Status, - NetFunction, - Command - )); + // + // Print out the response payloads. + HelperManageabilityDebugPrint ((VOID *)&RspHeader, (UINT16)RspHeaderSize= , "KCS Response Header:\n"); + + if ((ResponseData !=3D NULL) && (ResponseDataSize !=3D NULL) && (*Respon= seDataSize !=3D 0)) { + Status =3D KcsTransportRead ((UINT8 *)ResponseData, ResponseDataSize); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "IPMI KCS response read Failed with Status(%r)"= , Status)); + } + + // + // Print out the response payloads. + HelperManageabilityDebugPrint ((VOID *)ResponseData, *ResponseDataSize= , "KCS Response Data:\n"); + } else { + *ResponseDataSize =3D 0; } =20 return Status; diff --git a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib= /Dxe/ManageabilityTransportKcs.c b/Features/ManageabilityPkg/Library/Manage= abilityTransportKcsLib/Dxe/ManageabilityTransportKcs.c index 7d85378fc1..c236354605 100644 --- a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/Ma= nageabilityTransportKcs.c +++ b/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/Ma= nageabilityTransportKcs.c @@ -218,23 +218,25 @@ KcsTransportTransmitReceive ( IN MANAGEABILITY_TRANSFER_TOKEN *TransferToken ) { - EFI_STATUS Status; - MANAGEABILITY_IPMI_TRANSPORT_HEADER *TransmitHeader; + EFI_STATUS Status; =20 if ((TransportToken =3D=3D NULL) || (TransferToken =3D=3D NULL)) { DEBUG ((DEBUG_ERROR, "%a: Invalid transport token or transfer token.\n= ", __FUNCTION__)); return; } =20 - TransmitHeader =3D (MANAGEABILITY_IPMI_TRANSPORT_HEADER *)TransferToken-= >TransmitHeader; - if (TransmitHeader =3D=3D NULL) { + // Transmit header is necessary for KCS transport, which could be + // NetFn, Command and etc. + if (TransferToken->TransmitHeader =3D=3D NULL) { TransferToken->TransferStatus =3D EFI_INVALID_PARAMETER; return; } =20 Status =3D KcsTransportSendCommand ( - TransmitHeader->NetFn, - TransmitHeader->Command, + TransferToken->TransmitHeader, + TransferToken->TransmitHeaderSize, + TransferToken->TransmitTrailer, + TransferToken->TransmitTrailerSize, TransferToken->TransmitPackage.TransmitPayload, TransferToken->TransmitPackage.TransmitSizeInByte, TransferToken->ReceivePackage.ReceiveBuffer, diff --git a/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiPr= otocolCommon.c b/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/Ip= miProtocolCommon.c index 82bae58292..b055bad7da 100644 --- a/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtocolC= ommon.c +++ b/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtocolC= ommon.c @@ -65,21 +65,23 @@ SetupIpmiTransportHardwareInformation ( This functions setup the final header/body/trailer packets for the acquired transport interface. =20 - @param[in] TransportToken The transport interface. - @param[in] NetFunction IPMI function. - @param[in] Command IPMI command. - @param[out] PacketHeader The pointer to receive header of requ= est. - @param[in, out] PacketBody The request body. - When IN, it is the caller's request b= ody. - When OUT and NULL, the request body i= s not - changed. - When OUT and non-NULL, the request bo= dy is - changed to conform the transport inte= rface. - @param[in, out] PacketBodySize The request body size. - When OUT and non-zero, it is the new = data - length of request body. - When OUT and zero, the request body i= s unchanged. - @param[out] PacketTrailer The pointer to receive trailer of req= uest. + @param[in] TransportToken The transport interface. + @param[in] NetFunction IPMI function. + @param[in] Command IPMI command. + @param[out] PacketHeader The pointer to receive header of r= equest. + @param[out] PacketHeaderSize Pinter to receive packet header si= ze in byte. + @param[in, out] PacketBody The request body. + When IN, it is the caller's reques= t body. + When OUT and NULL, the request bod= y is not + changed. + Whee out and non-NULL, the request= body is + changed to comfort the transport i= nterface. + @param[in, out] PacketBodySize The request body size. + When IN and non-zero, it is the ne= w data + length of request body. + When IN and zero, the request body= is unchanged. + @param[out] PacketTrailer The pointer to receive trailer of = request. + @param[out] PacketTrailerSize Pinter to receive packet trailer s= ize in byte. =20 @retval EFI_SUCCESS Request packet is returned. @retval EFI_UNSUPPORTED Request packet is not returned because @@ -91,9 +93,11 @@ SetupIpmiRequestTransportPacket ( IN UINT8 NetFunction, IN UINT8 Command, OUT MANAGEABILITY_TRANSPORT_HEADER *PacketHeader OPTIONAL, + OUT UINT16 *PacketHeaderSize, IN OUT UINT8 **PacketBody OPTIONAL, IN OUT UINT32 *PacketBodySize OPTIONAL, - OUT MANAGEABILITY_TRANSPORT_TRAILER *PacketTrailer OPTIONAL + OUT MANAGEABILITY_TRANSPORT_TRAILER *PacketTrailer OPTIONAL, + OUT UINT16 *PacketTrailerSize ) { MANAGEABILITY_IPMI_TRANSPORT_HEADER *IpmiHeader; @@ -105,18 +109,24 @@ SetupIpmiRequestTransportPacket ( return EFI_OUT_OF_RESOURCES; } =20 + *PacketHeaderSize =3D 0; + *PacketTrailerSize =3D 0; IpmiHeader->Command =3D Command; IpmiHeader->Lun =3D 0; IpmiHeader->NetFn =3D NetFunction; if (PacketHeader !=3D NULL) { - *PacketHeader =3D (MANAGEABILITY_TRANSPORT_HEADER *)IpmiHeader; + *PacketHeader =3D (MANAGEABILITY_TRANSPORT_HEADER *)IpmiHeader; + *PacketHeaderSize =3D sizeof (MANAGEABILITY_IPMI_TRANSPORT_HEADER); } + if (PacketTrailer !=3D NULL) { *PacketTrailer =3D NULL; } + if (PacketBody !=3D NULL) { *PacketBody =3D NULL; } + if (PacketBodySize !=3D NULL) { *PacketBodySize =3D 0; } @@ -124,6 +134,7 @@ SetupIpmiRequestTransportPacket ( DEBUG ((DEBUG_ERROR, "%a: No implementation of building up packet.", _= _FUNCTION__)); ASSERT (FALSE); } + return EFI_SUCCESS; } =20 @@ -164,6 +175,8 @@ CommonIpmiSubmitCommand ( MANAGEABILITY_TRANSPORT_HEADER IpmiTransportHeader; MANAGEABILITY_TRANSPORT_TRAILER IpmiTransportTrailer; MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS TransportAdditionalStatus; + UINT16 HeaderSize; + UINT16 TrailerSize; =20 if (TransportToken =3D=3D NULL) { DEBUG ((DEBUG_ERROR, "%a: No transport toke for IPMI\n", __FUNCTION__)= ); @@ -179,8 +192,8 @@ CommonIpmiSubmitCommand ( return Status; } =20 - ThisRequestData =3D RequestData; - ThisRequestDataSize =3D RequestDataSize; + ThisRequestData =3D RequestData; + ThisRequestDataSize =3D RequestDataSize; IpmiTransportHeader =3D NULL; IpmiTransportTrailer =3D NULL; Status =3D SetupIpmiRequestTransportPacket ( @@ -188,9 +201,11 @@ CommonIpmiSubmitCommand ( NetFunction, Command, &IpmiTransportHeader, + &HeaderSize, &ThisRequestData, &ThisRequestDataSize, - &IpmiTransportTrailer + &IpmiTransportTrailer, + &TrailerSize ); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "%a: Fail to build packets - (%r)\n", __FUNCTION_= _, Status)); @@ -198,12 +213,13 @@ CommonIpmiSubmitCommand ( } =20 ZeroMem (&TransferToken, sizeof (MANAGEABILITY_TRANSFER_TOKEN)); - TransferToken.TransmitHeader =3D IpmiTransportHeader; - TransferToken.TransmitTrailer =3D IpmiTransportTrailer; + TransferToken.TransmitHeader =3D IpmiTransportHeader; + TransferToken.TransmitHeaderSize =3D HeaderSize; + TransferToken.TransmitTrailer =3D IpmiTransportTrailer; + TransferToken.TransmitTrailerSize =3D TrailerSize; =20 // Transmit packet. if ((ThisRequestData =3D=3D NULL) || (ThisRequestDataSize =3D=3D 0)) { - // Transmit parameter were not changed by SetupIpmiRequestTransportPac= ket(). TransferToken.TransmitPackage.TransmitPayload =3D RequestData; TransferToken.TransmitPackage.TransmitSizeInByte =3D RequestDataSize; @@ -247,5 +263,6 @@ CommonIpmiSubmitCommand ( if (ResponseDataSize !=3D NULL) { *ResponseDataSize =3D TransferToken.ReceivePackage.ReceiveSizeInByte; } + return Status; } diff --git a/Features/ManageabilityPkg/Readme.md b/Features/ManageabilityPk= g/Readme.md index 2ecee96313..81c9322b98 100644 --- a/Features/ManageabilityPkg/Readme.md +++ b/Features/ManageabilityPkg/Readme.md @@ -99,7 +99,9 @@ library to compliant with the framework of ManageabilityP= kg design. struct _MANAGEABILITY_TRANSFER_TOKEN { EFI_EVENT ReceiveEvent; MANAGEABILITY_TRANSPORT_HEADER TransmitHeader; + UINT16 TransmitHeaderSize; MANAGEABILITY_TRANSPORT_TRAILER TransmitTrailer; + UINT16 TransmitTrailerSize; MANAGEABILITY_TRANSMIT_PACKAGE TransmitPackage; MANAGEABILITY_RECEIVE_PACKAGE ReceivePackage; EFI_STATUS TransferStatus; @@ -124,6 +126,10 @@ library to compliant with the framework of Manageabili= tyPkg design. manageability transport library to make the transport implementation a= gnostic to the manageability protocol specification. =20 +* ***TransmitHeaderSize*** + + This indicates the size of TransmitHeader. + * ***TransmitTrailer*** =20 The transmit trailer may be different according to the disparate trans= port @@ -131,6 +137,10 @@ library to compliant with the framework of Manageabili= tyPkg design. manageability transport library to make the transport implementation a= gnostic to the manageability protocol specification. =20 +* ***TransmitTrailerSize*** + + This indicates the size of TransmitTrailer. + * ***TransmitPackage*** =20 The buffer of packet to transmit, this could be a value of NULL if the= manageability --=20 2.37.1.windows.1