#include "MctpAsioEndpoint.hpp"

#include <boost/asio/generic/datagram_protocol.hpp>
#include <phosphor-logging/lg2.hpp>

#include <bit>
#include <cstdint>
#include <optional>

// Becuase of issues with glibc not matching linux, we need to make sure these
// are included AFTER the system headers, which are implictly included by boost.
// These show up as errors like
// /usr/include/net/if.h:44:14: error: ‘IFF_UP’ conflicts with a previous
// declaration
// The bugs below are other projects working around similar issues
// https://bugzilla.redhat.com/show_bug.cgi?id=1300256
// https://github.com/systemd/systemd/commit/08ce521fb2546921f2642bef067d2cc02158b121
// https://github.com/systemd/systemd/issues/2864
// clang-format off
#include <linux/mctp.h>
#include <sys/socket.h>
// clang-format on

MctpAsioEndpoint::MctpAsioEndpoint(uint8_t eid, uint8_t msgType)
{
    endpoint.resize(sizeof(struct sockaddr_mctp));
    struct sockaddr_mctp* sock =
        std::bit_cast<struct sockaddr_mctp*>(endpoint.data());
    sock->smctp_addr.s_addr = eid;
    sock->smctp_family = AF_MCTP;
    sock->smctp_type = msgType;
    sock->smctp_tag = MCTP_TAG_OWNER;
    sock->smctp_network = MCTP_NET_ANY;
};

MctpAsioEndpoint::MctpAsioEndpoint(uint8_t msgType) :
    MctpAsioEndpoint{MCTP_ADDR_ANY, msgType}
{}

std::optional<uint8_t> MctpAsioEndpoint::eid() const
{
    const struct sockaddr_mctp* sock = getSockAddr();
    if (sock == nullptr)
    {
        return std::nullopt;
    }
    return sock->smctp_addr.s_addr;
}

std::optional<uint8_t> MctpAsioEndpoint::type() const
{
    const struct sockaddr_mctp* sock = getSockAddr();
    if (sock == nullptr)
    {
        return std::nullopt;
    }
    return sock->smctp_type;
}

const struct sockaddr_mctp* MctpAsioEndpoint::getSockAddr() const
{
    if (endpoint.size() < sizeof(struct sockaddr_mctp))
    {
        lg2::error("MctpRequester: Received endpoint is too small?");
        return nullptr;
    }

    return std::bit_cast<struct sockaddr_mctp*>(endpoint.data());
}
