kcsbridge: Remove package
We no longer need this code now that it is upstream in phosphor-ipmi-kcs
Change-Id: Iaf1d5450b4c62f35e2deea53e5ce9b5981415f15
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/.gitignore b/.gitignore
index 30ae886..210bc0f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,6 @@
build*/
subprojects/*
!subprojects/acpi-power-state-daemon/
-!subprojects/kcsbridge/
!subprojects/metrics-ipmi-blobs/
!subprojects/ncsid/
!subprojects/nemora-postd/
diff --git a/kcsbridge b/kcsbridge
deleted file mode 120000
index bf7dcf7..0000000
--- a/kcsbridge
+++ /dev/null
@@ -1 +0,0 @@
-subprojects/kcsbridge
\ No newline at end of file
diff --git a/meson.build b/meson.build
index 534d61f..76719a2 100644
--- a/meson.build
+++ b/meson.build
@@ -35,7 +35,6 @@
endif
subproject('acpi-power-state-daemon')
-subproject('kcsbridge')
subproject('ncsid', default_options: 'tests=' + tests_str)
subproject('metrics-ipmi-blobs', default_options: 'tests=' + tests_str)
subproject('nemora-postd')
diff --git a/subprojects/kcsbridge/meson.build b/subprojects/kcsbridge/meson.build
deleted file mode 100644
index 3d14785..0000000
--- a/subprojects/kcsbridge/meson.build
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright 2021 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-project(
- 'kcsbridge',
- ['cpp', 'c'],
- version: '0.1',
- meson_version: '>=0.53.2',
- default_options: [
- 'warning_level=3',
- 'werror=true',
- 'cpp_std=c++17',
- ])
-
-subdir('src')
diff --git a/subprojects/kcsbridge/src/args.cpp b/subprojects/kcsbridge/src/args.cpp
deleted file mode 100644
index c96ac4b..0000000
--- a/subprojects/kcsbridge/src/args.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright 2021 Google LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "args.hpp"
-
-#include <fmt/format.h>
-#include <getopt.h>
-
-#include <stdexcept>
-
-namespace kcsbridge
-{
-
-Args::Args(int argc, char* argv[])
-{
- static const char opts[] = ":c:";
- static const struct option longopts[] = {
- {"channel", required_argument, nullptr, 'c'},
- {nullptr, 0, nullptr, 0},
- };
- int c;
- optind = 0;
- while ((c = getopt_long(argc, argv, opts, longopts, nullptr)) > 0)
- {
- switch (c)
- {
- case 'c':
- channel = optarg;
- break;
- case ':':
- throw std::runtime_error(
- fmt::format("Missing argument for `{}`", argv[optind - 1]));
- break;
- default:
- throw std::runtime_error(fmt::format(
- "Invalid command line argument `{}`", argv[optind - 1]));
- }
- }
- if (optind != argc)
- {
- throw std::invalid_argument("Requires no additional arguments");
- }
- if (channel == nullptr)
- {
- throw std::invalid_argument("Missing KCS channel");
- }
-}
-
-} // namespace kcsbridge
diff --git a/subprojects/kcsbridge/src/args.hpp b/subprojects/kcsbridge/src/args.hpp
deleted file mode 100644
index 39b28c1..0000000
--- a/subprojects/kcsbridge/src/args.hpp
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2021 Google LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-#include <cstddef>
-
-namespace kcsbridge
-{
-
-struct Args
-{
- const char* channel = nullptr;
-
- Args(int argc, char* argv[]);
-};
-
-} // namespace kcsbridge
diff --git a/subprojects/kcsbridge/src/dbus.hpp b/subprojects/kcsbridge/src/dbus.hpp
deleted file mode 100644
index 7a92d2d..0000000
--- a/subprojects/kcsbridge/src/dbus.hpp
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright 2021 Google LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-#include <fmt/format.h>
-#include <systemd/sd-bus.h>
-
-#include <sdbusplus/message.hpp>
-#include <stdplus/handle/managed.hpp>
-#include <stdplus/util/cexec.hpp>
-
-#include <limits>
-#include <stdexcept>
-#include <type_traits>
-#include <utility>
-
-namespace kcsbridge
-{
-
-struct SdBusSlotDrop
-{
- void operator()(sd_bus_slot* slot) noexcept
- {
- sd_bus_slot_unref(slot);
- }
-};
-using ManagedSdBusSlot = stdplus::Managed<sd_bus_slot*>::HandleF<SdBusSlotDrop>;
-
-template <typename CbT>
-int busCallAsyncCb(sd_bus_message* m, void* userdata, sd_bus_error*) noexcept
-{
- try
- {
- (*reinterpret_cast<CbT*>(userdata))(sdbusplus::message::message(m));
- }
- catch (const std::exception& e)
- {
- fmt::print(stderr, "Callback failed: {}\n", e.what());
- }
- return 1;
-}
-
-template <typename CbT>
-void busCallAsyncDest(void* userdata) noexcept
-{
- delete reinterpret_cast<CbT*>(userdata);
-}
-
-template <typename Cb>
-auto busCallAsync(sdbusplus::message::message&& m, Cb&& cb)
-{
- sd_bus_slot* slot;
- using CbT = std::remove_cv_t<std::remove_reference_t<Cb>>;
- CHECK_RET(sd_bus_call_async(nullptr, &slot, m.get(), busCallAsyncCb<CbT>,
- nullptr, std::numeric_limits<uint64_t>::max()),
- "sd_bus_call_async");
- ManagedSdBusSlot ret(std::move(slot));
- CHECK_RET(sd_bus_slot_set_destroy_callback(*ret, busCallAsyncDest<CbT>),
- "sd_bus_slot_set_destroy_callback");
- sd_bus_slot_set_userdata(*ret, new CbT(std::forward<Cb>(cb)));
- return ret;
-}
-
-template <auto func, typename Data>
-int methodRsp(sd_bus_message* mptr, void* dataptr, sd_bus_error* error) noexcept
-{
- sdbusplus::message::message m(mptr);
- try
- {
- func(m, *reinterpret_cast<Data*>(dataptr));
- }
- catch (const std::exception& e)
- {
- fmt::print(stderr, "Method response failed: {}\n", e.what());
- sd_bus_error_set(error,
- "xyz.openbmc_project.Common.Error.InternalFailure",
- "The operation failed internally.");
- }
- return 1;
-}
-
-} // namespace kcsbridge
diff --git a/subprojects/kcsbridge/src/kcsbridge@.service.in b/subprojects/kcsbridge/src/kcsbridge@.service.in
deleted file mode 100644
index ef62d5f..0000000
--- a/subprojects/kcsbridge/src/kcsbridge@.service.in
+++ /dev/null
@@ -1,11 +0,0 @@
-[Unit]
-Description=Google IPMI KCS Bridge
-After=phosphor-ipmi-host.service
-
-[Service]
-Restart=on-failure
-Type=notify
-ExecStart=@BIN@ -c '%I'
-
-[Install]
-WantedBy=multi-user.target
diff --git a/subprojects/kcsbridge/src/main.cpp b/subprojects/kcsbridge/src/main.cpp
deleted file mode 100644
index 8a7114b..0000000
--- a/subprojects/kcsbridge/src/main.cpp
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright 2021 Google LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "args.hpp"
-#include "dbus.hpp"
-
-#include <fmt/format.h>
-#include <linux/ipmi_bmc.h>
-#include <systemd/sd-daemon.h>
-
-#include <sdbusplus/bus.hpp>
-#include <sdbusplus/exception.hpp>
-#include <sdbusplus/server/interface.hpp>
-#include <sdbusplus/vtable.hpp>
-#include <sdeventplus/event.hpp>
-#include <sdeventplus/source/io.hpp>
-#include <sdeventplus/source/signal.hpp>
-#include <stdplus/fd/create.hpp>
-#include <stdplus/fd/ops.hpp>
-#include <stdplus/signal.hpp>
-
-#include <array>
-#include <map>
-#include <stdexcept>
-#include <tuple>
-#include <utility>
-#include <variant>
-
-namespace kcsbridge
-{
-
-using sdbusplus::bus::bus;
-using sdbusplus::message::message;
-using sdeventplus::source::IO;
-using sdeventplus::source::Signal;
-using stdplus::fd::OpenAccess;
-using stdplus::fd::OpenFlag;
-using stdplus::fd::OpenFlags;
-
-void setAttention(message& m, stdplus::Fd& kcs)
-{
- stdplus::fd::ioctl(kcs, IPMI_BMC_IOCTL_SET_SMS_ATN, nullptr);
- m.new_method_return().method_return();
-}
-
-void clearAttention(message& m, stdplus::Fd& kcs)
-{
- stdplus::fd::ioctl(kcs, IPMI_BMC_IOCTL_CLEAR_SMS_ATN, nullptr);
- m.new_method_return().method_return();
-}
-
-void forceAbort(message& m, stdplus::Fd& kcs)
-{
- stdplus::fd::ioctl(kcs, IPMI_BMC_IOCTL_FORCE_ABORT, nullptr);
- m.new_method_return().method_return();
-}
-
-template <typename Data>
-constexpr sdbusplus::vtable::vtable_t dbusMethods[] = {
- sdbusplus::vtable::start(),
- sdbusplus::vtable::method("setAttention", "", "",
- methodRsp<setAttention, Data>),
- sdbusplus::vtable::method("clearAttention", "", "",
- methodRsp<clearAttention, Data>),
- sdbusplus::vtable::method("forceAbort", "", "",
- methodRsp<forceAbort, Data>),
- sdbusplus::vtable::end(),
-};
-
-void write(stdplus::Fd& kcs, message&& m)
-{
- std::array<uint8_t, 1024> buffer;
- stdplus::span<uint8_t> out(buffer.begin(), 3);
- try
- {
- if (m.is_method_error())
- {
- // Extra copy to workaround lack of `const sd_bus_error` constructor
- auto error = *m.get_error();
- throw sdbusplus::exception::SdBusError(&error, "ipmid response");
- }
- std::tuple<uint8_t, uint8_t, uint8_t, uint8_t, std::vector<uint8_t>>
- ret;
- m.read(ret);
- const auto& [netfn, lun, cmd, cc, data] = ret;
- // Based on the IPMI KCS spec Figure 9-2
- // netfn needs to be changed to odd in KCS responses
- buffer[0] = (netfn | 1) << 2;
- buffer[0] |= lun;
- buffer[1] = cmd;
- buffer[2] = cc;
- memcpy(&buffer[3], data.data(), data.size());
- out = stdplus::span<uint8_t>(buffer.begin(), data.size() + 3);
- }
- catch (const std::exception& e)
- {
- fmt::print(stderr, "IPMI response failure: {}\n", e.what());
- buffer[0] |= 1 << 2;
- buffer[2] = 0xff;
- }
- stdplus::fd::writeExact(kcs, out);
-}
-
-void read(stdplus::Fd& kcs, bus& bus, ManagedSdBusSlot& slot)
-{
- std::array<uint8_t, 1024> buffer;
- auto in = stdplus::fd::read(kcs, buffer);
- if (in.empty())
- {
- return;
- }
- if (slot)
- {
- fmt::print(stderr, "Canceling outstanding request\n");
- slot.reset();
- }
- if (in.size() < 2)
- {
- fmt::print(stderr, "Read too small, ignoring\n");
- return;
- }
- auto m = bus.new_method_call("xyz.openbmc_project.Ipmi.Host",
- "/xyz/openbmc_project/Ipmi",
- "xyz.openbmc_project.Ipmi.Server", "execute");
- std::map<std::string, std::variant<int>> options;
- // Based on the IPMI KCS spec Figure 9-1
- uint8_t netfn = in[0] >> 2, lun = in[0] & 3, cmd = in[1];
- m.append(netfn, lun, cmd, in.subspan(2), options);
- slot = busCallAsync(std::move(m), [&](message&& m) {
- slot.reset();
- write(kcs, std::move(m));
- });
-}
-
-int execute(const char* channel)
-{
- // Set up our DBus and event loop
- auto event = sdeventplus::Event::get_default();
- auto bus = sdbusplus::bus::new_default();
- bus.attach_event(event.get(), SD_EVENT_PRIORITY_NORMAL);
-
- // Configure basic signal handling
- auto exit_handler = [&](Signal&, const struct signalfd_siginfo*) {
- fmt::print(stderr, "Interrupted, Exiting\n");
- event.exit(0);
- };
- stdplus::signal::block(SIGINT);
- Signal sig_int(event, SIGINT, exit_handler);
- stdplus::signal::block(SIGTERM);
- Signal sig_term(event, SIGTERM, exit_handler);
-
- // Open an FD for the KCS channel
- stdplus::ManagedFd kcs = stdplus::fd::open(
- fmt::format("/dev/{}", channel),
- OpenFlags(OpenAccess::ReadWrite).set(OpenFlag::NonBlock));
- ManagedSdBusSlot slot(std::nullopt);
-
- // Add a reader to the bus for handling inbound IPMI
- IO ioSource(event, kcs.get(), EPOLLIN | EPOLLET,
- [&](IO&, int, uint32_t) { read(kcs, bus, slot); });
-
- // Allow processes to affect the state machine
- std::optional<sdbusplus::server::interface::interface> intf;
- {
- std::string dbusChannel = channel;
- std::replace(dbusChannel.begin(), dbusChannel.end(), '-', '_');
- auto obj = "/xyz/openbmc_project/Ipmi/Channel/" + dbusChannel;
- auto srv = "com.google.gbmc." + dbusChannel;
- intf.emplace(bus, obj.c_str(), "xyz.openbmc_project.Ipmi.Channel.SMS",
- dbusMethods<stdplus::Fd>,
- reinterpret_cast<stdplus::Fd*>(&kcs));
- bus.request_name(srv.c_str());
- }
-
- sd_notify(0, "READY=1");
- return event.loop();
-}
-
-} // namespace kcsbridge
-
-int main(int argc, char* argv[])
-{
- try
- {
- kcsbridge::Args args(argc, argv);
- return kcsbridge::execute(args.channel);
- }
- catch (const std::exception& e)
- {
- fmt::print(stderr, "FAILED: {}\n", e.what());
- return 1;
- }
-}
diff --git a/subprojects/kcsbridge/src/meson.build b/subprojects/kcsbridge/src/meson.build
deleted file mode 100644
index f463d92..0000000
--- a/subprojects/kcsbridge/src/meson.build
+++ /dev/null
@@ -1,68 +0,0 @@
-# Copyright 2021 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-headers = include_directories('.')
-
-fmt_dep = dependency('fmt', required: false)
-if not fmt_dep.found()
- fmt_proj = import('cmake').subproject(
- 'fmt',
- cmake_options: [
- '-DCMAKE_POSITION_INDEPENDENT_CODE=ON',
- '-DMASTER_PROJECT=OFF'
- ],
- required: false)
- assert(fmt_proj.found(), 'fmtlib is required')
- fmt_dep = fmt_proj.dependency('fmt')
-endif
-
-deps = [
- fmt_dep,
- dependency('stdplus', fallback: ['stdplus', 'stdplus']),
- dependency('sdbusplus', fallback: ['sdbusplus', 'sdbusplus_dep']),
- dependency('sdeventplus', fallback: ['sdeventplus', 'sdeventplus']),
- dependency('libsystemd'),
-]
-
-lib = static_library(
- 'kcsbridged',
- 'args.cpp',
- include_directories: headers,
- implicit_include_directories: false,
- dependencies: deps)
-
-dep = declare_dependency(
- dependencies: deps,
- include_directories: headers,
- link_with: lib)
-
-libexecdir = get_option('prefix') / get_option('libexecdir')
-
-executable(
- 'kcsbridged',
- 'main.cpp',
- implicit_include_directories: false,
- dependencies: dep,
- install: true,
- install_dir: libexecdir)
-
-systemd = dependency('systemd', required: false)
-if systemd.found()
- configure_file(
- configuration: {'BIN': libexecdir / 'kcsbridged'},
- input: 'kcsbridge@.service.in',
- output: 'kcsbridge@.service',
- install_mode: 'rw-r--r--',
- install_dir: systemd.get_pkgconfig_variable('systemdsystemunitdir'))
-endif
diff --git a/subprojects/kcsbridge/subprojects b/subprojects/kcsbridge/subprojects
deleted file mode 120000
index a96aa0e..0000000
--- a/subprojects/kcsbridge/subprojects
+++ /dev/null
@@ -1 +0,0 @@
-..
\ No newline at end of file
diff --git a/subprojects/sdeventplus.wrap b/subprojects/sdeventplus.wrap
deleted file mode 100644
index 7503664..0000000
--- a/subprojects/sdeventplus.wrap
+++ /dev/null
@@ -1,3 +0,0 @@
-[wrap-git]
-url = https://github.com/openbmc/sdeventplus
-revision = HEAD