From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by spool.mail.gandi.net (Postfix) with ESMTPS id A9A26AC1177 for ; Mon, 23 Oct 2023 13:05:22 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=2DUPYs54Ad1LWH30sQYddDONScPh77bIToZTvZFdx08=; c=relaxed/simple; d=groups.io; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References:MIME-Version:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Transfer-Encoding; s=20140610; t=1698066321; v=1; b=dnY6htV1NHMsMEVcE3KExGrUTQpt2y5mLeNgMQsXioPxOhZL0XYjV0krBy25aGJDMYyAI0ks iBeL/cp1iZaQBcQ/uXl7x2XIWZ7UFsmXUn3JcRFhQrjKlz1wmNvNy/VAW2ViUCOuO6HVsxPr6PV bYhe4L0Ze7GSlz9NeyovolZY= X-Received: by 127.0.0.2 with SMTP id Heh1YY7687511xbyduAaaseR; Mon, 23 Oct 2023 06:05:21 -0700 X-Received: from mail-lj1-f175.google.com (mail-lj1-f175.google.com [209.85.208.175]) by mx.groups.io with SMTP id smtpd.web11.120282.1698066320314374691 for ; Mon, 23 Oct 2023 06:05:20 -0700 X-Received: by mail-lj1-f175.google.com with SMTP id 38308e7fff4ca-2c509f2c46cso46554411fa.1 for ; Mon, 23 Oct 2023 06:05:20 -0700 (PDT) X-Gm-Message-State: YQeckJtdJWA5sJZRJT0FC2cDx7686176AA= X-Google-Smtp-Source: AGHT+IFjGmp/YW1ffCb1Bgtku/G1q7odyFKFjKqkd+lArdn2xJ3ZbHg0qpLmqZT0fxeLL26zTqbAlg== X-Received: by 2002:a05:651c:11d3:b0:2c5:16c0:623b with SMTP id z19-20020a05651c11d300b002c516c0623bmr5557067ljo.34.1698066317863; Mon, 23 Oct 2023 06:05:17 -0700 (PDT) X-Received: from PC10319.67 ([82.97.198.254]) by smtp.googlemail.com with ESMTPSA id r11-20020a2e994b000000b002b9e0d19644sm1550081ljj.106.2023.10.23.06.05.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Oct 2023 06:05:17 -0700 (PDT) From: "Konstantin Aladyshev" To: devel@edk2.groups.io Cc: abner.chang@amd.com, AbdulLateef.Attar@amd.com, nicklew@nvidia.com, Konstantin Aladyshev Subject: [edk2-devel] [PATCH edk2-platforms v3 03/16] ManageabilityPkg: Support both MCTP and IPMI in KCS tranport library Date: Mon, 23 Oct 2023 16:04:58 +0300 Message-Id: <20231023130511.4521-4-aladyshev22@gmail.com> In-Reply-To: <20231023130511.4521-1-aladyshev22@gmail.com> References: <20231023130511.4521-1-aladyshev22@gmail.com> MIME-Version: 1.0 Precedence: Bulk List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,aladyshev22@gmail.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: Content-Transfer-Encoding: quoted-printable X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20140610 header.b=dnY6htV1; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=gmail.com (policy=none); spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce@groups.io The Manageability KCS transport library needs to support requests both from MCTP and IPMI transports. Currently the code only handles IPMI case correctly. In the MCTP case the communication should be based on the MCTP-over-KCS specification (DSP0254). This specification defines a special KCS binding header and trailer structures that need to be present in every MCTP message. The header structure contains a length field, therefore response packet size is not needed to be known beforehand. The trailer structure contains a PEC checksum that can be used to check itegrity of the response message. Modify Manageability KCS transport library code to check which message is processed (IPMI or MCTP) and handle each case correctly based on its own specification. Tested: - The IPMI KCS communication is tested by Abner Chang, - The MCTP KCS communication is tested by Konstantin Aladyshev on the AMD EthanolX CRB. Signed-off-by: Konstantin Aladyshev Signed-off-by: Abner Chang --- .../Common/KcsCommon.c | 284 +++++++++++++++--- .../MctpProtocol/Common/MctpProtocolCommon.c | 14 +- 2 files changed, 260 insertions(+), 38 deletions(-) diff --git a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib= /Common/KcsCommon.c b/Features/ManageabilityPkg/Library/ManageabilityTransp= ortKcsLib/Common/KcsCommon.c index d5b54c04be..4f7e7d450f 100644 --- a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common= /KcsCommon.c +++ b/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common= /KcsCommon.c @@ -8,16 +8,19 @@ **/=0D #include =0D #include =0D +#include =0D #include =0D #include =0D #include =0D #include =0D +#include =0D #include =0D #include =0D =0D #include "ManageabilityTransportKcs.h"=0D =0D extern MANAGEABILITY_TRANSPORT_KCS_HARDWARE_INFO mKcsHardwareInfo;=0D +extern MANAGEABILITY_TRANSPORT_KCS *mSingleSessionToken;=0D =0D /**=0D This function waits for parameter Flag to set.=0D @@ -379,6 +382,218 @@ KcsTransportRead ( return EFI_SUCCESS;=0D }=0D =0D +/**=0D + This funciton checks the KCS response data according to=0D + manageability protocol.=0D +=0D + @param[in] ResponseData Pointer to response data.=0D + @param[in] ResponseDataSize Size of response data.=0D + @param[out] AdditionalStatus Pointer to receive the additional st= atus.=0D +=0D + @retval EFI_SUCCESS KCS response header is checked witho= ut error=0D + @retval EFI_DEVICE_ERROR KCS response header has problem.=0D +**/=0D +EFI_STATUS=0D +KcsCheckResponseData (=0D + IN UINT8 *ResponseData,=0D + IN UINT32 ResponseDataSize,=0D + OUT MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS *AdditionalStatus=0D + )=0D +{=0D + EFI_STATUS Status;=0D + MANAGEABILITY_MCTP_KCS_TRAILER MctpKcsPec;=0D + UINT32 PecSize;=0D + UINT8 CalculatedPec;=0D + CHAR16 *CompletionCodeStr;=0D +=0D + Status =3D EFI_SUCCESS;=0D + *AdditionalStatus =3D MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_NO_ERROR= S;=0D + if (CompareGuid (&gManageabilityProtocolMctpGuid, mSingleSessionToken->T= oken.ManageabilityProtocolSpecification)) {=0D + //=0D + // For MCTP over KCS, check PEC=0D + //=0D + PecSize =3D sizeof (MANAGEABILITY_MCTP_KCS_TRAILER) + 1; // +1 to rea= d last dummy byte that finishes KCS transfer=0D + Status =3D KcsTransportRead (&MctpKcsPec.Pec, &PecSize);=0D + if (EFI_ERROR (Status)) {=0D + DEBUG ((=0D + DEBUG_ERROR,=0D + "%a: Error! Failed to read PEC with Status(%r)\n",=0D + __func__,=0D + Status=0D + ));=0D + *AdditionalStatus =3D MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_ERRO= R;=0D + return Status;=0D + }=0D +=0D + if (PecSize !=3D sizeof (MctpKcsPec)) {=0D + DEBUG ((=0D + DEBUG_ERROR,=0D + "%a: Error! Received PEC size is %d instead of %d\n",=0D + __func__,=0D + PecSize,=0D + sizeof (MctpKcsPec)=0D + ));=0D + *AdditionalStatus =3D MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_ERRO= R;=0D + return EFI_DEVICE_ERROR;=0D + }=0D +=0D + HelperManageabilityDebugPrint ((VOID *)&MctpKcsPec.Pec, PecSize - 1, "= MCTP over KCS Response PEC:\n");=0D + CalculatedPec =3D HelperManageabilityGenerateCrc8 (MCTP_KCS_PACKET_ERR= OR_CODE_POLY, 0, ResponseData, ResponseDataSize);=0D + if (CalculatedPec !=3D MctpKcsPec.Pec) {=0D + DEBUG ((=0D + DEBUG_ERROR,=0D + "%a: Error! Received PEC is 0x%02x instead of 0x%02x\n",=0D + __func__,=0D + MctpKcsPec.Pec,=0D + CalculatedPec=0D + ));=0D + Status =3D EFI_DEVICE_ERROR;=0D + }=0D + } else if (CompareGuid (&gManageabilityProtocolIpmiGuid, mSingleSessionT= oken->Token.ManageabilityProtocolSpecification)) {=0D + //=0D + // For IPMI over KCS=0D + // Check and print Completion Code=0D + //=0D + Status =3D IpmiHelperCheckCompletionCode (*ResponseData, &CompletionCo= deStr, AdditionalStatus);=0D + if (!EFI_ERROR (Status)) {=0D + DEBUG ((DEBUG_MANAGEABILITY_INFO, "Cc: %02x %s.\n", *((UINT8 *)Respo= nseData), CompletionCodeStr));=0D + } else if (Status =3D=3D EFI_NOT_FOUND) {=0D + DEBUG ((DEBUG_ERROR, "Cc: %02x not defined in IpmiCompletionCodeMapp= ing or invalid.\n", *((UINT8 *)ResponseData)));=0D + }=0D + }=0D +=0D + return Status;=0D +}=0D +=0D +/**=0D + This funciton reads the KCS response header according to=0D + manageability protocol. Caller has to free the memory=0D + allocated for response header.=0D +=0D + @param[in] ResponseHeader Pointer to receive the response h= eader.=0D + @param[out] AdditionalStatus Pointer to receive the additional= status.=0D +=0D + @retval EFI_SUCCESS KCS response header is checked an= d returned=0D + to caller.=0D + @retval EFI_INVALID_PARAMETER One of the given parameter is inc= orrect.=0D + @retval EFI_OUT_OF_RESOURCE Memory allocation is failed for R= esponseHeader.=0D + @retval EFI_DEVICE_ERROR Incorrect response header.=0D +**/=0D +EFI_STATUS=0D +KcsReadResponseHeader (=0D + IN UINT8 **ResponseHeader,=0D + OUT MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS *AdditionalStatus=0D + )=0D +{=0D + EFI_STATUS Status;=0D + UINT32 RspHeaderSize;=0D + UINT32 ExpectedHeaderSize;=0D + UINT8 *RspHeader;=0D +=0D + if ((ResponseHeader =3D=3D NULL) || (AdditionalStatus =3D=3D NULL)) {=0D + return EFI_INVALID_PARAMETER;=0D + }=0D +=0D + *ResponseHeader =3D NULL;=0D + if (CompareGuid (&gManageabilityProtocolMctpGuid, mSingleSessionToken->T= oken.ManageabilityProtocolSpecification)) {=0D +=0D + // For MCTP over KCS=0D + ExpectedHeaderSize =3D sizeof (MANAGEABILITY_MCTP_KCS_HEADER);=0D + DEBUG ((=0D + DEBUG_MANAGEABILITY_INFO,=0D + "%a: Reading MCTP over KCS response header.\n",=0D + __func__=0D + ));=0D + } else if (CompareGuid (&gManageabilityProtocolIpmiGuid, mSingleSessionT= oken->Token.ManageabilityProtocolSpecification)) {=0D + // For IPMI over KCS=0D +=0D + ExpectedHeaderSize =3D sizeof (IPMI_KCS_RESPONSE_HEADER);=0D + DEBUG ((=0D + DEBUG_MANAGEABILITY_INFO,=0D + "%a: Reading IPMI over KCS response header.\n",=0D + __func__=0D + ));=0D + } else {=0D + DEBUG ((=0D + DEBUG_ERROR,=0D + "%a: Error! Unsupportted manageability protocol over KCS: %g.\n",=0D + __func__,=0D + mSingleSessionToken->Token.ManageabilityProtocolSpecification=0D + ));=0D + return EFI_INVALID_PARAMETER;=0D + }=0D +=0D + RspHeader =3D (UINT8 *)AllocateZeroPool (ExpectedHeaderSize);=0D + if (RspHeader =3D=3D NULL) {=0D + DEBUG ((DEBUG_ERROR, "Memory allocation failed for KCS response header= !\n"));=0D + return EFI_OUT_OF_RESOURCES;=0D + }=0D +=0D + RspHeaderSize =3D ExpectedHeaderSize;=0D + Status =3D KcsTransportRead (RspHeader, &RspHeaderSize);=0D + if (EFI_ERROR (Status)) {=0D + DEBUG ((=0D + DEBUG_ERROR,=0D + "%a: Error! Failed to read KCS response header Status(%r)\n",=0D + __func__,=0D + Status=0D + ));=0D + FreePool (RspHeader);=0D + *AdditionalStatus =3D MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_ERROR;= =0D + return Status;=0D + }=0D +=0D + if (RspHeaderSize !=3D 0) {=0D + HelperManageabilityDebugPrint ((VOID *)RspHeader, RspHeaderSize, "KCS = Response Header:\n");=0D + }=0D +=0D + if (ExpectedHeaderSize !=3D RspHeaderSize) {=0D + DEBUG ((=0D + DEBUG_ERROR,=0D + "The size (%d bytes) of returned resposne header is not the same as = expection (%d bytes)!\n",=0D + RspHeaderSize,=0D + ExpectedHeaderSize=0D + ));=0D + FreePool (RspHeader);=0D + return EFI_DEVICE_ERROR;=0D + }=0D +=0D + if (CompareGuid (&gManageabilityProtocolMctpGuid, mSingleSessionToken->T= oken.ManageabilityProtocolSpecification)) {=0D + //=0D + // MCTP over KCS=0D + //=0D + if (((MANAGEABILITY_MCTP_KCS_HEADER *)RspHeader)->NetFunc !=3D MCTP_KC= S_NETFN_LUN) {=0D + DEBUG ((=0D + DEBUG_ERROR,=0D + "%a: Error! MANAGEABILITY_MCTP_KCS_HEADER.NetFunc is equal 0x%02x = instead of 0x%02x\n",=0D + __func__,=0D + ((MANAGEABILITY_MCTP_KCS_HEADER *)RspHeader)->NetFunc,=0D + MCTP_KCS_NETFN_LUN=0D + ));=0D + FreePool (RspHeader);=0D + *AdditionalStatus =3D MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_ERRO= R;=0D + return EFI_DEVICE_ERROR;=0D + }=0D +=0D + if (((MANAGEABILITY_MCTP_KCS_HEADER *)RspHeader)->DefiningBody !=3D DE= FINING_BODY_DMTF_PRE_OS_WORKING_GROUP) {=0D + DEBUG ((=0D + DEBUG_ERROR,=0D + "%a: Error! MANAGEABILITY_MCTP_KCS_HEADER.DefiningBody is equal 0x= %02x instead of 0x%02x\n",=0D + __func__,=0D + ((MANAGEABILITY_MCTP_KCS_HEADER *)RspHeader)->DefiningBody,=0D + DEFINING_BODY_DMTF_PRE_OS_WORKING_GROUP=0D + ));=0D + FreePool (RspHeader);=0D + *AdditionalStatus =3D MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_ERRO= R;=0D + return EFI_DEVICE_ERROR;=0D + }=0D + }=0D +=0D + *ResponseHeader =3D RspHeader;=0D + *AdditionalStatus =3D MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_NO_ERROR= S;=0D + return EFI_SUCCESS;=0D +}=0D +=0D /**=0D This service communicates with BMC using KCS protocol.=0D =0D @@ -423,11 +638,9 @@ KcsTransportSendCommand ( OUT MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS *AdditionalStatus=0D )=0D {=0D - EFI_STATUS Status;=0D - UINT32 RspHeaderSize;=0D - IPMI_KCS_RESPONSE_HEADER RspHeader;=0D - UINT32 ExpectedResponseDataSize;=0D - CHAR16 *CompletionCodeStr;=0D + EFI_STATUS Status;=0D + UINT8 *RspHeader;=0D + UINT32 ExpectedResponseDataSize;=0D =0D if ((RequestData !=3D NULL) && (RequestDataSize =3D=3D 0)) {=0D DEBUG ((DEBUG_ERROR, "%a: Mismatched values of RequestData and Request= DataSize\n", __func__));=0D @@ -467,56 +680,59 @@ KcsTransportSendCommand ( RequestDataSize=0D );=0D if (EFI_ERROR (Status)) {=0D - DEBUG ((DEBUG_ERROR, "KCS Write Failed with Status(%r)", Status));=0D + DEBUG ((DEBUG_ERROR, "KCS Write Failed with Status(%r)\n", Status));= =0D return Status;=0D }=0D + }=0D =0D + if ((ResponseData !=3D NULL) && (ResponseDataSize !=3D NULL) && (*Respon= seDataSize !=3D 0)) {=0D //=0D // Read the response header=0D - RspHeaderSize =3D sizeof (IPMI_KCS_RESPONSE_HEADER);=0D - Status =3D KcsTransportRead ((UINT8 *)&RspHeader, &RspHeaderSiz= e);=0D + //=0D + Status =3D KcsReadResponseHeader (&RspHeader, AdditionalStatus);=0D if (EFI_ERROR (Status)) {=0D - DEBUG ((=0D - DEBUG_ERROR,=0D - "KCS read response header failed Status(%r), " \=0D - "RspNetFunctionLun =3D 0x%x, " \=0D - "Comamnd =3D 0x%x \n",=0D - Status,=0D - RspHeader.NetFunc,=0D - RspHeader.Command=0D - ));=0D return (Status);=0D }=0D =0D //=0D - // Print out the response payloads.=0D - HelperManageabilityDebugPrint ((VOID *)&RspHeader, RspHeaderSize, "KCS= Response Header:\n");=0D - }=0D + // Override ResposeDataSize if the manageability protocol is MCTP.=0D + //=0D + if (CompareGuid (&gManageabilityProtocolMctpGuid, mSingleSessionToken-= >Token.ManageabilityProtocolSpecification)) {=0D + if (*ResponseDataSize < ((MANAGEABILITY_MCTP_KCS_HEADER *)RspHeader)= ->ByteCount) {=0D + DEBUG ((=0D + DEBUG_ERROR,=0D + "%a: Error! MANAGEABILITY_MCTP_KCS_HEADER.ByteCount (0x%02x) is = bigger than provided buffer (0x%02x)\n",=0D + __func__,=0D + ((MANAGEABILITY_MCTP_KCS_HEADER *)RspHeader)->ByteCount,=0D + *ResponseDataSize=0D + ));=0D + return EFI_INVALID_PARAMETER;=0D + }=0D +=0D + *ResponseDataSize =3D ((MANAGEABILITY_MCTP_KCS_HEADER *)RspHeader)->= ByteCount;=0D + }=0D + FreePool (RspHeader);=0D =0D - if ((ResponseData !=3D NULL) && (ResponseDataSize !=3D NULL) && (*Respon= seDataSize !=3D 0)) {=0D ExpectedResponseDataSize =3D *ResponseDataSize;=0D - Status =3D KcsTransportRead ((UINT8 *)ResponseData, = ResponseDataSize);=0D + Status =3D KcsTransportRead (ResponseData, ResponseD= ataSize);=0D if (EFI_ERROR (Status)) {=0D - DEBUG ((DEBUG_ERROR, "KCS response read Failed with Status(%r)", Sta= tus));=0D + DEBUG ((DEBUG_ERROR, "KCS response read Failed with Status(%r)\n", S= tatus));=0D }=0D =0D - //=0D // Print out the response payloads.=0D if (*ResponseDataSize !=3D 0) {=0D if (ExpectedResponseDataSize !=3D *ResponseDataSize) {=0D - DEBUG ((DEBUG_ERROR, "Expected KCS response size : %d is not match= ed to returned size : %d.\n", ExpectedResponseDataSize, *ResponseDataSize))= ;=0D - Status =3D EFI_DEVICE_ERROR;=0D + DEBUG ((=0D + DEBUG_ERROR,=0D + "Expected KCS response size : %d is not matched to returned size= : %d.\n",=0D + ExpectedResponseDataSize,=0D + *ResponseDataSize=0D + ));=0D + return EFI_DEVICE_ERROR;=0D }=0D =0D HelperManageabilityDebugPrint ((VOID *)ResponseData, (UINT32)*Respon= seDataSize, "KCS Response Data:\n");=0D -=0D - // Print Completion Code=0D - Status =3D IpmiHelperCheckCompletionCode (*((UINT8 *)ResponseData), = &CompletionCodeStr, AdditionalStatus);=0D - if (!EFI_ERROR (Status)) {=0D - DEBUG ((DEBUG_MANAGEABILITY_INFO, "Cc: %02x %s.\n", *((UINT8 *)Res= ponseData), CompletionCodeStr));=0D - } else if (Status =3D=3D EFI_NOT_FOUND) {=0D - DEBUG ((DEBUG_MANAGEABILITY_INFO, "Cc: %02x not defined in IpmiCom= pletionCodeMapping or invalid.\n", *((UINT8 *)ResponseData)));=0D - }=0D + Status =3D KcsCheckResponseData (ResponseData, *ResponseDataSize, Ad= ditionalStatus);=0D } else {=0D DEBUG ((DEBUG_ERROR, "No response, can't determine Completion Code.\= n"));=0D }=0D diff --git a/Features/ManageabilityPkg/Universal/MctpProtocol/Common/MctpPr= otocolCommon.c b/Features/ManageabilityPkg/Universal/MctpProtocol/Common/Mc= tpProtocolCommon.c index 7576007f77..e560c638d5 100644 --- a/Features/ManageabilityPkg/Universal/MctpProtocol/Common/MctpProtocolC= ommon.c +++ b/Features/ManageabilityPkg/Universal/MctpProtocol/Common/MctpProtocolC= ommon.c @@ -267,6 +267,9 @@ CommonMctpSubmitMessage ( MANAGEABILITY_TRANSPORT_TRAILER MctpTransportTrailer;=0D MANAGEABILITY_TRANSMISSION_MULTI_PACKAGES *MultiPackages;=0D MANAGEABILITY_TRANSMISSION_PACKAGE_ATTR *ThisPackage;=0D + UINT8 *ResponseBuffer;=0D + MCTP_TRANSPORT_HEADER *MctpTransportResponseHeader;= =0D + MCTP_MESSAGE_HEADER *MctpMessageResponseHeader;=0D =0D if (TransportToken =3D=3D NULL) {=0D DEBUG ((DEBUG_ERROR, "%a: No transport toke for MCTP\n", __func__));=0D @@ -435,11 +438,12 @@ CommonMctpSubmitMessage ( ThisPackage++;=0D }=0D =0D + ResponseBuffer =3D (UINT8 *)AllocatePool (*ResponseDataSize + sizeof (MC= TP_TRANSPORT_HEADER) + sizeof (MCTP_MESSAGE_HEADER));=0D // Receive packet.=0D TransferToken.TransmitPackage.TransmitPayload =3D NULL;=0D TransferToken.TransmitPackage.TransmitSizeInByte =3D 0;=0D - TransferToken.ReceivePackage.ReceiveBuffer =3D ResponseDa= ta;=0D - TransferToken.ReceivePackage.ReceiveSizeInByte =3D *ResponseD= ataSize;=0D + TransferToken.ReceivePackage.ReceiveBuffer =3D ResponseBu= ffer;=0D + TransferToken.ReceivePackage.ReceiveSizeInByte =3D *ResponseD= ataSize + sizeof (MCTP_TRANSPORT_HEADER) + sizeof (MCTP_MESSAGE_HEADER);=0D TransferToken.TransmitHeader =3D NULL;=0D TransferToken.TransmitHeaderSize =3D 0;=0D TransferToken.TransmitTrailer =3D NULL;=0D @@ -461,8 +465,10 @@ CommonMctpSubmitMessage ( // Return transfer status.=0D //=0D *AdditionalTransferError =3D TransferToken.TransportAdditionalStatus;=0D - *ResponseDataSize =3D TransferToken.ReceivePackage.ReceiveSizeInB= yte;=0D - Status =3D TransferToken.TransferStatus;=0D + *ResponseDataSize =3D TransferToken.ReceivePackage.ReceiveSizeInB= yte - sizeof (MCTP_TRANSPORT_HEADER) - sizeof (MCTP_MESSAGE_HEADER);=0D + CopyMem (ResponseData, ResponseBuffer + sizeof (MCTP_TRANSPORT_HEADER) += sizeof (MCTP_MESSAGE_HEADER), *ResponseDataSize);=0D + FreePool (ResponseBuffer);=0D + Status =3D TransferToken.TransferStatus;=0D if (EFI_ERROR (Status)) {=0D DEBUG ((DEBUG_ERROR, "%a: Failed to send MCTP command over %s: %r\n", = __func__, mTransportName, Status));=0D return Status;=0D --=20 2.34.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#109911): https://edk2.groups.io/g/devel/message/109911 Mute This Topic: https://groups.io/mt/102134651/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=-