Skip to content

Commit 2bb2365

Browse files
Adding response mechanism to remote terminus
- this changes are in suppoort of aynchronous file io operation between pldm and remote terminus. - previously pldm send response to remote terminus when it's complete the operation and that duration pldm is blocked but new response mechanism will be introduced in case of event loop, pldm can take time to process request and meanwhile it can receive another request. Change-Id: I9537d5525e6af76b7867608a2e4f3492b2a631d2 Signed-off-by: Kamalkumar Patel <[email protected]>
1 parent b70a72b commit 2bb2365

15 files changed

+213
-36
lines changed

common/utils.hpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,13 @@ struct CustomFD
6161
CustomFD(CustomFD&&) = delete;
6262
CustomFD& operator=(CustomFD&&) = delete;
6363

64-
CustomFD(int fd) : fd(fd) {}
64+
CustomFD(int fd, bool closeOnOutScope = true) :
65+
fd(fd), closeOnOutScope(closeOnOutScope)
66+
{}
6567

6668
~CustomFD()
6769
{
68-
if (fd >= 0)
70+
if (fd >= 0 && closeOnOutScope)
6971
{
7072
close(fd);
7173
}
@@ -78,6 +80,7 @@ struct CustomFD
7880

7981
private:
8082
int fd = -1;
83+
bool closeOnOutScope;
8184
};
8285

8386
/** @brief Calculate the pad for PLDM data

oem/ibm/libpldmresponder/file_io.hpp

+17-2
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,27 @@
11
#pragma once
22

33
#include "common/utils.hpp"
4+
#include "file_io_by_type.hpp"
45
#include "oem/ibm/requester/dbus_to_file_handler.hpp"
56
#include "oem_ibm_handler.hpp"
67
#include "pldmd/handler.hpp"
8+
#include "pldmd/pldm_resp_interface.hpp"
79
#include "requester/handler.hpp"
810

911
#include <fcntl.h>
1012
#include <libpldm/base.h>
1113
#include <libpldm/file_io.h>
1214
#include <libpldm/host.h>
1315
#include <stdint.h>
16+
#include <sys/mman.h>
1417
#include <sys/stat.h>
1518
#include <sys/types.h>
1619
#include <unistd.h>
1720

1821
#include <phosphor-logging/lg2.hpp>
1922

2023
#include <filesystem>
24+
#include <functional>
2125
#include <iostream>
2226
#include <vector>
2327

@@ -29,6 +33,14 @@ namespace responder
2933
{
3034
namespace dma
3135
{
36+
37+
struct IOPart
38+
{
39+
uint32_t length;
40+
uint32_t offset;
41+
uint64_t address;
42+
};
43+
3244
// The minimum data size of dma transfer in bytes
3345
constexpr uint32_t minSize = 16;
3446

@@ -172,10 +184,12 @@ class Handler : public CmdHandler
172184
public:
173185
Handler(oem_platform::Handler* oemPlatformHandler, int hostSockFd,
174186
uint8_t hostEid, dbus_api::Requester* dbusImplReqester,
175-
pldm::requester::Handler<pldm::requester::Request>* handler) :
187+
pldm::requester::Handler<pldm::requester::Request>* handler,
188+
pldm::response_api::Transport* respInterface) :
176189
oemPlatformHandler(oemPlatformHandler),
177190
hostSockFd(hostSockFd), hostEid(hostEid),
178-
dbusImplReqester(dbusImplReqester), handler(handler)
191+
dbusImplReqester(dbusImplReqester), handler(handler),
192+
responseHdr({0, 0, respInterface, 0, -1})
179193
{
180194
handlers.emplace(PLDM_READ_FILE_INTO_MEMORY,
181195
[this](const pldm_msg* request, size_t payloadLength) {
@@ -490,6 +504,7 @@ class Handler : public CmdHandler
490504
pldm::requester::Handler<pldm::requester::Request>* handler;
491505
std::vector<std::unique_ptr<pldm::requester::oem_ibm::DbusToFileHandler>>
492506
dbusToFileHandlers;
507+
ResponseHdr responseHdr;
493508
};
494509

495510
} // namespace oem_ibm

oem/ibm/libpldmresponder/file_io_by_type.hpp

+17-1
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,29 @@
11
#pragma once
22

3-
#include "file_io.hpp"
3+
#include "oem_ibm_handler.hpp"
4+
#include "pldmd/pldm_resp_interface.hpp"
45

56
namespace pldm
67
{
78

89
namespace responder
910
{
1011

12+
class FileHandler;
13+
namespace dma
14+
{
15+
class DMA;
16+
} // namespace dma
17+
18+
struct ResponseHdr
19+
{
20+
uint8_t instance_id;
21+
uint8_t command;
22+
pldm::response_api::Transport* respInterface;
23+
std::shared_ptr<FileHandler> functionPtr = nullptr;
24+
int key;
25+
};
26+
1127
namespace fs = std::filesystem;
1228

1329
/**

oem/ibm/libpldmresponder/file_io_type_cert.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#pragma once
22

3-
#include "file_io_by_type.hpp"
3+
#include "file_io.hpp"
44

55
#include <tuple>
66

oem/ibm/libpldmresponder/file_io_type_dump.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#pragma once
22

3-
#include "file_io_by_type.hpp"
3+
#include "file_io.hpp"
44

55
namespace pldm
66
{

oem/ibm/libpldmresponder/file_io_type_lic.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#pragma once
22

3-
#include "file_io_by_type.hpp"
3+
#include "file_io.hpp"
44

55
namespace pldm
66
{

oem/ibm/libpldmresponder/file_io_type_lid.hpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#pragma once
22

3-
#include "file_io_by_type.hpp"
4-
#include "xyz/openbmc_project/Common/error.hpp"
3+
#include "file_io.hpp"
54

65
#include <phosphor-logging/elog-errors.hpp>
76
#include <phosphor-logging/elog.hpp>

oem/ibm/libpldmresponder/file_io_type_pcie.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#pragma once
22

3-
#include "file_io_by_type.hpp"
3+
#include "file_io.hpp"
44

55
#include <arpa/inet.h>
66
#include <fcntl.h>

oem/ibm/libpldmresponder/file_io_type_pel.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#pragma once
22

3-
#include "file_io_by_type.hpp"
3+
#include "file_io.hpp"
44

55
namespace pldm
66
{

oem/ibm/libpldmresponder/file_io_type_progress_src.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#pragma once
22

3-
#include "file_io_by_type.hpp"
3+
#include "file_io.hpp"
44

55
namespace pldm
66
{

oem/ibm/libpldmresponder/file_io_type_vpd.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#pragma once
22

3-
#include "file_io_by_type.hpp"
3+
#include "file_io.hpp"
44

55
namespace pldm
66
{

oem/ibm/libpldmresponder/oem_ibm_handler.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
#include "collect_slot_vpd.hpp"
77
#include "file_io_type_lid.hpp"
8-
#include "libpldmresponder/file_io.hpp"
98
#include "libpldmresponder/pdr_utils.hpp"
109

1110
#include <phosphor-logging/lg2.hpp>

oem/ibm/test/libpldmresponder_fileio_test.cpp

+18-18
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ TEST(ReadFileIntoMemory, BadPath)
225225
// Pass invalid payload length
226226
std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
227227
oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
228-
nullptr, nullptr);
228+
nullptr, nullptr, nullptr);
229229
auto response = handler.readFileIntoMemory(request, 0);
230230
auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
231231
ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
@@ -259,7 +259,7 @@ TEST_F(TestFileTable, ReadFileInvalidFileHandle)
259259

260260
std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
261261
oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
262-
nullptr, nullptr);
262+
nullptr, nullptr, nullptr);
263263
auto response = handler.readFileIntoMemory(request, requestPayloadLength);
264264
auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
265265
ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_HANDLE);
@@ -294,7 +294,7 @@ TEST_F(TestFileTable, ReadFileInvalidOffset)
294294

295295
std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
296296
oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
297-
nullptr, nullptr);
297+
nullptr, nullptr, nullptr);
298298
auto response = handler.readFileIntoMemory(request, requestPayloadLength);
299299
auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
300300
ASSERT_EQ(responsePtr->payload[0], PLDM_DATA_OUT_OF_RANGE);
@@ -329,7 +329,7 @@ TEST_F(TestFileTable, ReadFileInvalidLength)
329329

330330
std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
331331
oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
332-
nullptr, nullptr);
332+
nullptr, nullptr, nullptr);
333333
auto response = handler.readFileIntoMemory(request, requestPayloadLength);
334334
auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
335335
ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
@@ -367,7 +367,7 @@ TEST_F(TestFileTable, ReadFileInvalidEffectiveLength)
367367

368368
std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
369369
oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
370-
nullptr, nullptr);
370+
nullptr, nullptr, nullptr);
371371
auto response = handler.readFileIntoMemory(request, requestPayloadLength);
372372
auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
373373
ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
@@ -399,7 +399,7 @@ TEST(WriteFileFromMemory, BadPath)
399399
// Pass invalid payload length
400400
std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
401401
oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
402-
nullptr, nullptr);
402+
nullptr, nullptr, nullptr);
403403
auto response = handler.writeFileFromMemory(request, 0);
404404
auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
405405
ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
@@ -438,7 +438,7 @@ TEST_F(TestFileTable, WriteFileInvalidFileHandle)
438438

439439
std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
440440
oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
441-
nullptr, nullptr);
441+
nullptr, nullptr, nullptr);
442442
auto response = handler.writeFileFromMemory(request, requestPayloadLength);
443443
auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
444444
ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_HANDLE);
@@ -474,7 +474,7 @@ TEST_F(TestFileTable, WriteFileInvalidOffset)
474474

475475
std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
476476
oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
477-
nullptr, nullptr);
477+
nullptr, nullptr, nullptr);
478478
auto response = handler.writeFileFromMemory(request, requestPayloadLength);
479479
auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
480480
ASSERT_EQ(responsePtr->payload[0], PLDM_DATA_OUT_OF_RANGE);
@@ -547,7 +547,7 @@ TEST_F(TestFileTable, GetFileTableCommand)
547547

548548
std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
549549
oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
550-
nullptr, nullptr);
550+
nullptr, nullptr, nullptr);
551551
auto response = handler.getFileTable(requestMsgPtr, requestPayloadLength);
552552
auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
553553
ASSERT_EQ(responsePtr->payload[0], PLDM_SUCCESS);
@@ -574,7 +574,7 @@ TEST_F(TestFileTable, GetFileTableCommandReqLengthMismatch)
574574
// Pass invalid command payload length
575575
std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
576576
oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
577-
nullptr, nullptr);
577+
nullptr, nullptr, nullptr);
578578
auto response = handler.getFileTable(request, 0);
579579
auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
580580
ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
@@ -600,7 +600,7 @@ TEST_F(TestFileTable, GetFileTableCommandOEMAttrTable)
600600

601601
std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
602602
oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
603-
nullptr, nullptr);
603+
nullptr, nullptr, nullptr);
604604
auto response = handler.getFileTable(requestMsgPtr, requestPayloadLength);
605605
auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
606606
ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_TABLE_TYPE);
@@ -632,7 +632,7 @@ TEST_F(TestFileTable, ReadFileBadPath)
632632
// Invalid payload length
633633
std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
634634
oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
635-
nullptr, nullptr);
635+
nullptr, nullptr, nullptr);
636636
auto response = handler.readFile(requestMsgPtr, 0);
637637
auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
638638
ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
@@ -686,7 +686,7 @@ TEST_F(TestFileTable, ReadFileGoodPath)
686686

687687
std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
688688
oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
689-
nullptr, nullptr);
689+
nullptr, nullptr, nullptr);
690690
auto responseMsg = handler.readFile(requestMsgPtr, payload_length);
691691
auto response = reinterpret_cast<pldm_read_file_resp*>(
692692
responseMsg.data() + sizeof(pldm_msg_hdr));
@@ -740,7 +740,7 @@ TEST_F(TestFileTable, WriteFileBadPath)
740740
// Invalid payload length
741741
std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
742742
oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
743-
nullptr, nullptr);
743+
nullptr, nullptr, nullptr);
744744
auto response = handler.writeFile(requestMsgPtr, 0);
745745
auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
746746
ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
@@ -791,7 +791,7 @@ TEST_F(TestFileTable, WriteFileGoodPath)
791791

792792
std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
793793
oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
794-
nullptr, nullptr);
794+
nullptr, nullptr, nullptr);
795795
auto responseMsg = handler.writeFile(requestMsgPtr, payload_length);
796796
auto response = reinterpret_cast<pldm_read_file_resp*>(
797797
responseMsg.data() + sizeof(pldm_msg_hdr));
@@ -829,7 +829,7 @@ TEST(writeFileByTypeFromMemory, testBadPath)
829829

830830
std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
831831
oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
832-
nullptr, nullptr);
832+
nullptr, nullptr, nullptr);
833833
auto response = handler.writeFileByTypeFromMemory(req, 0);
834834
auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
835835

@@ -909,7 +909,7 @@ TEST(readFileByTypeIntoMemory, testBadPath)
909909

910910
std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
911911
oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
912-
nullptr, nullptr);
912+
nullptr, nullptr, nullptr);
913913
auto response = handler.readFileByTypeIntoMemory(req, 0);
914914
auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
915915
struct pldm_read_write_file_by_type_memory_resp* resp =
@@ -951,7 +951,7 @@ TEST(readFileByType, testBadPath)
951951

952952
std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
953953
oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
954-
nullptr, nullptr);
954+
nullptr, nullptr, nullptr);
955955
auto response = handler.readFileByType(req, 0);
956956
auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
957957
struct pldm_read_write_file_by_type_resp* resp =

0 commit comments

Comments
 (0)