xref: /openbmc/kcsbridge/src/server.cpp (revision 4bf990ac)
1 #include "server.hpp"
2 
3 #include "print.hpp"
4 
5 #include <linux/ipmi_bmc.h>
6 
7 #include <sdbusplus/exception.hpp>
8 #include <sdbusplus/server/interface.hpp>
9 #include <sdbusplus/vtable.hpp>
10 #include <stdplus/fd/ops.hpp>
11 
12 #include <cstdio>
13 #include <stdexcept>
14 
15 namespace kcsbridge
16 {
17 
18 void setAttention(sdbusplus::message_t& m, stdplus::Fd& kcs)
19 {
20     stdplus::fd::ioctl(kcs, IPMI_BMC_IOCTL_SET_SMS_ATN, nullptr);
21     m.new_method_return().method_return();
22 }
23 
24 void clearAttention(sdbusplus::message_t& m, stdplus::Fd& kcs)
25 {
26     stdplus::fd::ioctl(kcs, IPMI_BMC_IOCTL_CLEAR_SMS_ATN, nullptr);
27     m.new_method_return().method_return();
28 }
29 
30 void forceAbort(sdbusplus::message_t& m, stdplus::Fd& kcs)
31 {
32     stdplus::fd::ioctl(kcs, IPMI_BMC_IOCTL_FORCE_ABORT, nullptr);
33     m.new_method_return().method_return();
34 }
35 
36 template <auto func, typename Data>
37 int methodRsp(sd_bus_message* mptr, void* dataptr, sd_bus_error* error) noexcept
38 {
39     sdbusplus::message_t m(mptr);
40     try
41     {
42         func(m, *reinterpret_cast<Data*>(dataptr));
43     }
44     catch (const std::exception& e)
45     {
46         std::print(stderr, "Method response failed: {}\n", e.what());
47         sd_bus_error_set(error,
48                          "xyz.openbmc_project.Common.Error.InternalFailure",
49                          "The operation failed internally.");
50     }
51     return 1;
52 }
53 
54 template <typename Data>
55 constexpr sdbusplus::vtable::vtable_t dbusMethods[] = {
56     sdbusplus::vtable::start(),
57     sdbusplus::vtable::method("setAttention", "", "",
58                               methodRsp<setAttention, Data>),
59     sdbusplus::vtable::method("clearAttention", "", "",
60                               methodRsp<clearAttention, Data>),
61     sdbusplus::vtable::method("forceAbort", "", "",
62                               methodRsp<forceAbort, Data>),
63     sdbusplus::vtable::end(),
64 };
65 
66 sdbusplus::server::interface::interface createSMSHandler(
67     sdbusplus::bus_t& bus, const char* obj, stdplus::Fd& kcs)
68 {
69     return sdbusplus::server::interface::interface(
70         bus, obj, "xyz.openbmc_project.Ipmi.Channel.SMS",
71         dbusMethods<stdplus::Fd>, reinterpret_cast<stdplus::Fd*>(&kcs));
72 }
73 
74 } // namespace kcsbridge
75