blob: 3aac5a66012b20e8964a9f6a030e062c6c1d0bc1 [file] [log] [blame]
Sora Su972381f2025-07-18 18:11:26 +08001#include "file_io.hpp"
2
Sora Su9e7232b2025-07-21 13:31:01 +08003#include "file_io_type_post_code.hpp"
4
Sora Su972381f2025-07-18 18:11:26 +08005#include <libpldm/oem/meta/file_io.h>
6
7#include <filesystem>
8namespace pldm::responder::oem_meta
9{
10
11std::unique_ptr<FileHandler> FileIOHandler::getHandlerByType(
12 [[maybe_unused]] pldm_tid_t messageTid, FileIOType fileIOType)
13{
14 switch (fileIOType)
15 {
Sora Su9e7232b2025-07-21 13:31:01 +080016 case FileIOType::POST_CODE:
17 return std::make_unique<PostCodeHandler>(messageTid);
Sora Su972381f2025-07-18 18:11:26 +080018 default:
19 error("Get invalid file io type {FILEIOTYPE}", "FILEIOTYPE",
20 fileIOType);
21 break;
22 }
23 return nullptr;
24}
25
26Response FileIOHandler::writeFileIO(pldm_tid_t tid, const pldm_msg* request,
27 size_t payloadLength)
28{
29 static constexpr uint8_t decodeDataMaxLength = 240;
30 constexpr uint8_t decodereqlen =
31 PLDM_OEM_META_FILE_IO_WRITE_REQ_MIN_LENGTH + decodeDataMaxLength;
32 alignas(struct pldm_oem_meta_file_io_write_req) unsigned char
33 reqbuf[decodereqlen];
34 auto request_msg = new (reqbuf) pldm_oem_meta_file_io_write_req;
35 auto request_data = static_cast<uint8_t*>(
36 pldm_oem_meta_file_io_write_req_data(request_msg));
37
38 int rc = decode_oem_meta_file_io_write_req(request, payloadLength,
39 request_msg, decodereqlen);
40
41 if (rc != 0)
42 {
43 error("Failed to decode OEM Meta write file IO request");
44 return ccOnlyResponse(request, rc);
45 }
46
47 auto handler =
48 getHandlerByType(tid, static_cast<FileIOType>(request_msg->handle));
49 if (!handler)
50 {
51 return ccOnlyResponse(request, PLDM_ERROR_UNSUPPORTED_PLDM_CMD);
52 }
53
54 auto data = std::span(request_data, request_msg->length);
55
56 rc = handler->write(data);
57
58 return ccOnlyResponse(request, rc);
59}
60
61Response FileIOHandler::readFileIO(pldm_tid_t tid, const pldm_msg* request,
62 size_t payloadLength)
63{
64 int rc;
65 struct pldm_oem_meta_file_io_read_req request_msg = {};
66 request_msg.version = sizeof(struct pldm_oem_meta_file_io_read_req);
67
68 rc = decode_oem_meta_file_io_read_req(request, payloadLength, &request_msg);
69
70 if (rc != 0)
71 {
72 error("Failed to decode OEM Meta read file IO request");
73 return ccOnlyResponse(request, rc);
74 }
75
76 auto handler =
77 getHandlerByType(tid, static_cast<FileIOType>(request_msg.handle));
78
79 if (!handler)
80 {
81 return ccOnlyResponse(request, PLDM_ERROR_UNSUPPORTED_PLDM_CMD);
82 }
83
84 size_t encoderesplen = PLDM_OEM_META_FILE_IO_READ_RESP_MIN_SIZE;
85 if (request_msg.option == PLDM_OEM_META_FILE_IO_READ_ATTR)
86 {
87 encoderesplen += PLDM_OEM_META_FILE_IO_READ_ATTR_INFO_LENGTH;
88 }
89 else
90 {
91 encoderesplen += PLDM_OEM_META_FILE_IO_READ_DATA_INFO_LENGTH;
92 }
93
94 std::vector<uint8_t> respbuf(
95 sizeof(struct pldm_oem_meta_file_io_read_resp) + request_msg.length);
96 auto* response_msg = new (respbuf.data()) pldm_oem_meta_file_io_read_resp;
97
98 response_msg->version = sizeof(struct pldm_oem_meta_file_io_read_resp);
99 response_msg->handle = request_msg.handle;
100 response_msg->option = request_msg.option;
101 response_msg->length = request_msg.length;
102
103 if (response_msg->option != PLDM_OEM_META_FILE_IO_READ_ATTR)
104 {
105 response_msg->info.data.transferFlag =
106 request_msg.info.data.transferFlag;
107 response_msg->info.data.offset = request_msg.info.data.offset;
108 }
109
110 rc = handler->read(response_msg);
111
112 if (rc != PLDM_SUCCESS)
113 {
114 return ccOnlyResponse(request, rc);
115 }
116
117 response_msg->completion_code = PLDM_SUCCESS;
118 encoderesplen += response_msg->length;
119
120 Response response(sizeof(pldm_msg_hdr) + encoderesplen, 0);
121 auto responseMsg = new (response.data()) pldm_msg;
122
123 rc = encode_oem_meta_file_io_read_resp(
124 request->hdr.instance_id, response_msg,
125 sizeof(struct pldm_oem_meta_file_io_read_resp) + response_msg->length,
126 responseMsg, encoderesplen);
127
128 if (rc != 0)
129 {
130 return ccOnlyResponse(request, rc);
131 }
132
133 return response;
134}
135
136} // namespace pldm::responder::oem_meta