blob: e9e1808ec28adc91e2fb6b6ca4c364674d6d061b [file] [log] [blame]
Rashmica Gupta1ed5f7a2023-05-22 13:56:42 +10001#pragma once
2
3#include <libpldm/base.h>
4#include <libpldm/pldm.h>
5#include <poll.h>
Pavithra Barithayab3b84b42024-08-23 11:43:57 +05306
7#include <cstddef>
Rashmica Gupta1ed5f7a2023-05-22 13:56:42 +10008
9struct pldm_transport_mctp_demux;
10struct pldm_transport_af_mctp;
11
12union TransportImpl
13{
14 struct pldm_transport_mctp_demux* mctp_demux;
15 struct pldm_transport_af_mctp* af_mctp;
16};
17
18/* RAII for pldm_transport */
19class PldmTransport
20{
21 public:
22 PldmTransport();
23 PldmTransport(const PldmTransport& other) = delete;
24 PldmTransport(const PldmTransport&& other) = delete;
25 PldmTransport& operator=(const PldmTransport& other) = delete;
26 PldmTransport& operator=(const PldmTransport&& other) = delete;
27 ~PldmTransport();
28
29 /** @brief Provides a file descriptor that can be polled for readiness.
30 *
31 * Readiness generally indicates that a call to recvMsg() will immediately
32 * yield a message.
33 *
34 * @return The relevant file descriptor.
35 */
36 int getEventSource() const;
37
38 /** @brief Asynchronously send a PLDM message to the specified terminus
39 *
40 * The message may be either a request or a response.
41 *
42 * @param[in] tid - The terminus ID of the message destination
43 * @param[in] tx - The encoded and framed message to send
44 * @param[in] len - The length of the buffer pointed-to by tx
45 *
46 * @return PLDM_REQUESTER_SUCCESS on success, otherwise an appropriate
47 * PLDM_REQUESTER_* error code.
48 */
49 pldm_requester_rc_t sendMsg(pldm_tid_t tid, const void* tx, size_t len);
50
51 /** @brief Asynchronously receive a PLDM message addressed to the local
52 * terminus
53 *
54 * The message may be either a request or a response.
55 *
56 * @param[out] tid - The terminus ID of the message source
57 * @param[out] rx - A pointer to the received, encoded message
58 * @param[out] len - The length of the buffer pointed-to by rx
59 *
60 * @return PLDM_REQUESTER_SUCCESS on success, otherwise an appropriate
61 * PLDM_REQUESTER_* error code.
62 */
63 pldm_requester_rc_t recvMsg(pldm_tid_t& tid, void*& rx, size_t& len);
64
65 /** @brief Synchronously exchange a request and response with the specified
66 * terminus.
67 *
68 * sendRecvMsg() is a wrapper for the non-compliant
69 * pldm_transport_send_recv_msg() API from libpldm. It is a crutch that may
70 * be used for to fulfil a PLDM request until libpldm implements a correct
71 * requester flow in accordance with the PLDM base specification (DSP0240).
72 *
73 * The implementation blocks after the request is sent until a response is
74 * received, or the upper time-bound on a PLDM exchange is reached. Control
75 * is only handed back to the caller once one of these two outcomes is
76 * achieved.
77 *
78 * @param[in] tid - The terminus ID of the endpoint with which the exchange
79 * will occur
80 * @param[in] tx - The encoded and framed message to send
81 * @param[in] txLen - The length of the buffer pointed-to by tx
82 * @param[out] rx - A pointer to the received, encoded message
83 * @param[out] rxLen - The length of the buffer pointed-to by rx
84 *
85 * @return PLDM_REQUESTER_SUCCESS on success, otherwise an appropriate
86 * PLDM_REQUESTER_* error code.
87 */
88 pldm_requester_rc_t sendRecvMsg(pldm_tid_t tid, const void* tx,
89 size_t txLen, void*& rx, size_t& rxLen);
90
91 private:
92 /** @brief A pollfd object for holding a file descriptor from the libpldm
93 * transport implementation
94 */
95 pollfd pfd;
96
97 /** @brief A union holding an appropriately-typed pointer to the selected
98 * libpldm transport implementation
99 */
100 TransportImpl impl;
101
102 /** @brief The abstract libpldm transport object for sending and receiving
103 * PLDM messages.
104 */
105 struct pldm_transport* transport;
106};