blob: ea419e745a4d0beef6f4cf1df87431c53e244131 [file] [log] [blame]
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +05301#pragma once
2
Patrick Venture8f6c5152018-09-11 17:45:33 -07003#include "timer.hpp"
4
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +05305#include <systemd/sd-event.h>
Patrick Venture8f6c5152018-09-11 17:45:33 -07006
William A. Kennington IIId1331082018-02-27 18:47:05 -08007#include <experimental/optional>
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +05308#include <sdbusplus/bus.hpp>
9#include <sdbusplus/server/object.hpp>
10#include <xyz/openbmc_project/State/Watchdog/server.hpp>
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +053011namespace phosphor
12{
13namespace watchdog
14{
Vishwanatha Subbanna00bd3772017-05-31 14:53:42 +053015namespace Base = sdbusplus::xyz::openbmc_project::State::server;
16using WatchdogInherits = sdbusplus::server::object::object<Base::Watchdog>;
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +053017
18/** @class Watchdog
19 * @brief OpenBMC watchdog implementation.
20 * @details A concrete implementation for the
21 * xyz.openbmc_project.State.Watchdog DBus API.
22 */
23class Watchdog : public WatchdogInherits
24{
Patrick Venture8f6c5152018-09-11 17:45:33 -070025 public:
26 Watchdog() = delete;
27 ~Watchdog() = default;
28 Watchdog(const Watchdog&) = delete;
29 Watchdog& operator=(const Watchdog&) = delete;
30 Watchdog(Watchdog&&) = delete;
31 Watchdog& operator=(Watchdog&&) = delete;
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +053032
Patrick Venture8f6c5152018-09-11 17:45:33 -070033 /** @brief Type used to hold the name of a systemd target.
34 */
35 using TargetName = std::string;
William A. Kennington III1232a152018-02-02 15:57:34 -080036
Patrick Venture8f6c5152018-09-11 17:45:33 -070037 /** @brief Type used to specify the parameters of a fallback watchdog
38 */
39 struct Fallback
40 {
41 Action action;
42 uint64_t interval;
43 bool always;
44 };
William A. Kennington IIId1331082018-02-27 18:47:05 -080045
Patrick Venture8f6c5152018-09-11 17:45:33 -070046 /** @brief Constructs the Watchdog object
47 *
48 * @param[in] bus - DBus bus to attach to.
49 * @param[in] objPath - Object path to attach to.
50 * @param[in] event - reference to sd_event unique pointer
51 * @param[in] actionTargets - map of systemd targets called on timeout
52 * @param[in] fallback
53 */
54 Watchdog(sdbusplus::bus::bus& bus, const char* objPath, EventPtr& event,
55 std::map<Action, TargetName>&& actionTargets =
56 std::map<Action, TargetName>(),
57 std::experimental::optional<Fallback>&& fallback =
58 std::experimental::nullopt) :
59 WatchdogInherits(bus, objPath),
60 bus(bus), actionTargets(std::move(actionTargets)),
61 fallback(std::move(fallback)),
62 timer(event, std::bind(&Watchdog::timeOutHandler, this))
63 {
64 // We need to poke the enable mechanism to make sure that the timer
65 // enters the fallback state if the fallback is always enabled.
66 tryFallbackOrDisable();
67 }
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +053068
Patrick Venture8f6c5152018-09-11 17:45:33 -070069 /** @brief Resets the TimeRemaining to the configured Interval
70 * Optionally enables the watchdog.
71 *
72 * @param[in] enableWatchdog - Should the call enable the watchdog
73 */
74 void resetTimeRemaining(bool enableWatchdog) override;
William A. Kennington III1726df62018-04-23 10:28:28 -070075
Patrick Venture8f6c5152018-09-11 17:45:33 -070076 /** @brief Since we are overriding the setter-enabled but not the
77 * getter-enabled, we need to have this using in order to
78 * allow passthrough usage of the getter-enabled.
79 */
80 using Base::Watchdog::enabled;
Vishwanatha Subbanna00bd3772017-05-31 14:53:42 +053081
Patrick Venture8f6c5152018-09-11 17:45:33 -070082 /** @brief Enable or disable watchdog
83 * If a watchdog state is changed from disable to enable,
84 * the watchdog timer is set with the default expiration
85 * interval and it starts counting down.
86 * If a watchdog is already enabled, setting @value to true
87 * has no effect.
88 *
89 * @param[in] value - 'true' to enable. 'false' to disable
90 *
91 * @return : applied value if success, previous value otherwise
92 */
93 bool enabled(bool value) override;
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +053094
Patrick Venture8f6c5152018-09-11 17:45:33 -070095 /** @brief Gets the remaining time before watchdog expires.
96 *
97 * @return 0 if watchdog is expired.
98 * Remaining time in milliseconds otherwise.
99 */
100 uint64_t timeRemaining() const override;
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +0530101
Patrick Venture8f6c5152018-09-11 17:45:33 -0700102 /** @brief Reset timer to expire after new timeout in milliseconds.
103 *
104 * @param[in] value - the time in milliseconds after which
105 * the watchdog will expire
106 *
107 * @return: updated timeout value if watchdog is enabled.
108 * 0 otherwise.
109 */
110 uint64_t timeRemaining(uint64_t value) override;
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +0530111
Patrick Venture8f6c5152018-09-11 17:45:33 -0700112 /** @brief Tells if the referenced timer is expired or not */
113 inline auto timerExpired() const
114 {
115 return timer.expired();
116 }
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +0530117
Patrick Venture8f6c5152018-09-11 17:45:33 -0700118 /** @brief Tells if the timer is running or not */
119 inline bool timerEnabled() const
120 {
121 return timer.getEnabled() != SD_EVENT_OFF;
122 }
William A. Kennington III0650a3f2018-03-01 10:53:25 -0800123
Patrick Venture8f6c5152018-09-11 17:45:33 -0700124 private:
125 /** @brief sdbusplus handle */
126 sdbusplus::bus::bus& bus;
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +0530127
Patrick Venture8f6c5152018-09-11 17:45:33 -0700128 /** @brief Map of systemd units to be started when the timer expires */
129 std::map<Action, TargetName> actionTargets;
Vishwanatha Subbanna3473d702017-05-30 16:38:50 +0530130
Patrick Venture8f6c5152018-09-11 17:45:33 -0700131 /** @brief Fallback timer options */
132 std::experimental::optional<Fallback> fallback;
William A. Kennington IIId1331082018-02-27 18:47:05 -0800133
Patrick Venture8f6c5152018-09-11 17:45:33 -0700134 /** @brief Contained timer object */
135 Timer timer;
Vishwanatha Subbanna8c5a2292017-05-30 15:34:23 +0530136
Patrick Venture8f6c5152018-09-11 17:45:33 -0700137 /** @brief Optional Callback handler on timer expirartion */
138 void timeOutHandler();
William A. Kennington III825f4982018-02-27 19:10:56 -0800139
Patrick Venture8f6c5152018-09-11 17:45:33 -0700140 /** @brief Attempt to enter the fallback watchdog or disables it */
141 void tryFallbackOrDisable();
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +0530142};
143
144} // namespace watchdog
145} // namespace phosphor