blob: 922b51caa971e90e324307eac5df52271bf22602 [file] [log] [blame]
Ed Tanous6ef89732025-10-21 11:25:40 -07001#include "MctpAsioEndpoint.hpp"
2
3#include <boost/asio/generic/datagram_protocol.hpp>
4#include <phosphor-logging/lg2.hpp>
5
6#include <bit>
7#include <cstdint>
8#include <optional>
9
10// Becuase of issues with glibc not matching linux, we need to make sure these
11// are included AFTER the system headers, which are implictly included by boost.
12// These show up as errors like
13// /usr/include/net/if.h:44:14: error: ‘IFF_UP’ conflicts with a previous
14// declaration
15// The bugs below are other projects working around similar issues
16// https://bugzilla.redhat.com/show_bug.cgi?id=1300256
17// https://github.com/systemd/systemd/commit/08ce521fb2546921f2642bef067d2cc02158b121
18// https://github.com/systemd/systemd/issues/2864
19// clang-format off
20#include <linux/mctp.h>
21#include <sys/socket.h>
22// clang-format on
23
24MctpAsioEndpoint::MctpAsioEndpoint(uint8_t eid, uint8_t msgType)
25{
26 endpoint.resize(sizeof(struct sockaddr_mctp));
27 struct sockaddr_mctp* sock =
28 std::bit_cast<struct sockaddr_mctp*>(endpoint.data());
29 sock->smctp_addr.s_addr = eid;
30 sock->smctp_family = AF_MCTP;
31 sock->smctp_type = msgType;
32 sock->smctp_tag = MCTP_TAG_OWNER;
33 sock->smctp_network = MCTP_NET_ANY;
34};
35
36MctpAsioEndpoint::MctpAsioEndpoint(uint8_t msgType) :
37 MctpAsioEndpoint{MCTP_ADDR_ANY, msgType}
38{}
39
40std::optional<uint8_t> MctpAsioEndpoint::eid() const
41{
42 const struct sockaddr_mctp* sock = getSockAddr();
43 if (sock == nullptr)
44 {
45 return std::nullopt;
46 }
47 return sock->smctp_addr.s_addr;
48}
49
50std::optional<uint8_t> MctpAsioEndpoint::type() const
51{
52 const struct sockaddr_mctp* sock = getSockAddr();
53 if (sock == nullptr)
54 {
55 return std::nullopt;
56 }
57 return sock->smctp_type;
58}
59
60const struct sockaddr_mctp* MctpAsioEndpoint::getSockAddr() const
61{
62 if (endpoint.size() < sizeof(struct sockaddr_mctp))
63 {
64 lg2::error("MctpRequester: Received endpoint is too small?");
65 return nullptr;
66 }
67
68 return std::bit_cast<struct sockaddr_mctp*>(endpoint.data());
69}