blob: 60bad4eafd0ddb0c8f90749ef818b09f75bca126 [file] [log] [blame]
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +05301#pragma once
2
3#include <systemd/sd-event.h>
William A. Kennington IIId1331082018-02-27 18:47:05 -08004#include <experimental/optional>
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +05305#include <sdbusplus/bus.hpp>
6#include <sdbusplus/server/object.hpp>
7#include <xyz/openbmc_project/State/Watchdog/server.hpp>
8#include "timer.hpp"
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +05309namespace phosphor
10{
11namespace watchdog
12{
Vishwanatha Subbanna00bd3772017-05-31 14:53:42 +053013namespace Base = sdbusplus::xyz::openbmc_project::State::server;
14using WatchdogInherits = sdbusplus::server::object::object<Base::Watchdog>;
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +053015
16/** @class Watchdog
17 * @brief OpenBMC watchdog implementation.
18 * @details A concrete implementation for the
19 * xyz.openbmc_project.State.Watchdog DBus API.
20 */
21class Watchdog : public WatchdogInherits
22{
23 public:
24 Watchdog() = delete;
25 ~Watchdog() = default;
26 Watchdog(const Watchdog&) = delete;
27 Watchdog& operator=(const Watchdog&) = delete;
28 Watchdog(Watchdog&&) = delete;
29 Watchdog& operator=(Watchdog &&) = delete;
30
William A. Kennington III1232a152018-02-02 15:57:34 -080031 /** @brief Type used to hold the name of a systemd target.
32 */
33 using TargetName = std::string;
34
William A. Kennington IIId1331082018-02-27 18:47:05 -080035 /** @brief Type used to specify the parameters of a fallback watchdog
36 */
37 struct Fallback {
38 Action action;
39 uint64_t interval;
40 };
41
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +053042 /** @brief Constructs the Watchdog object
43 *
William A. Kennington III1232a152018-02-02 15:57:34 -080044 * @param[in] bus - DBus bus to attach to.
45 * @param[in] objPath - Object path to attach to.
46 * @param[in] event - reference to sd_event unique pointer
47 * @param[in] actionTargets - map of systemd targets called on timeout
William A. Kennington IIId1331082018-02-27 18:47:05 -080048 * @param[in] fallback
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +053049 */
50 Watchdog(sdbusplus::bus::bus& bus,
51 const char* objPath,
Vishwanatha Subbanna3473d702017-05-30 16:38:50 +053052 EventPtr& event,
William A. Kennington III1232a152018-02-02 15:57:34 -080053 std::map<Action, TargetName>&& actionTargets =
William A. Kennington IIId1331082018-02-27 18:47:05 -080054 std::map<Action, TargetName>(),
55 std::experimental::optional<Fallback>&&
56 fallback = std::experimental::nullopt) :
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +053057 WatchdogInherits(bus, objPath),
58 bus(bus),
William A. Kennington III1232a152018-02-02 15:57:34 -080059 actionTargets(std::move(actionTargets)),
William A. Kennington IIId1331082018-02-27 18:47:05 -080060 fallback(std::move(fallback)),
Vishwanatha Subbanna8c5a2292017-05-30 15:34:23 +053061 timer(event, std::bind(&Watchdog::timeOutHandler, this))
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +053062 {
63 // Nothing
64 }
65
Vishwanatha Subbanna00bd3772017-05-31 14:53:42 +053066 /** @brief Since we are overriding the setter-enabled but not the
67 * getter-enabled, we need to have this using in order to
68 * allow passthrough usage of the getter-enabled.
69 */
70 using Base::Watchdog::enabled;
71
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +053072 /** @brief Enable or disable watchdog
73 * If a watchdog state is changed from disable to enable,
74 * the watchdog timer is set with the default expiration
75 * interval and it starts counting down.
76 * If a watchdog is already enabled, setting @value to true
77 * has no effect.
78 *
79 * @param[in] value - 'true' to enable. 'false' to disable
80 *
81 * @return : applied value if success, previous value otherwise
82 */
83 bool enabled(bool value) override;
84
85 /** @brief Gets the remaining time before watchdog expires.
86 *
William A. Kennington III825f4982018-02-27 19:10:56 -080087 * @return 0 if watchdog is expired.
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +053088 * Remaining time in milliseconds otherwise.
89 */
90 uint64_t timeRemaining() const override;
91
92 /** @brief Reset timer to expire after new timeout in milliseconds.
93 *
Gunnar Millsbfe5cb82017-10-25 20:48:50 -050094 * @param[in] value - the time in milliseconds after which
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +053095 * the watchdog will expire
96 *
97 * @return: updated timeout value if watchdog is enabled.
98 * 0 otherwise.
99 */
100 uint64_t timeRemaining(uint64_t value) override;
101
102 /** @brief Tells if the referenced timer is expired or not */
103 inline auto timerExpired() const
104 {
105 return timer.expired();
106 }
107
William A. Kennington III0650a3f2018-03-01 10:53:25 -0800108 /** @brief Tells if the timer is running or not */
109 inline bool timerEnabled() const
110 {
111 return timer.getEnabled() != SD_EVENT_OFF;
112 }
113
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +0530114 private:
115 /** @brief sdbusplus handle */
116 sdbusplus::bus::bus& bus;
117
William A. Kennington III1232a152018-02-02 15:57:34 -0800118 /** @brief Map of systemd units to be started when the timer expires */
119 std::map<Action, TargetName> actionTargets;
Vishwanatha Subbanna3473d702017-05-30 16:38:50 +0530120
William A. Kennington IIId1331082018-02-27 18:47:05 -0800121 /** @brief Fallback timer options */
122 std::experimental::optional<Fallback> fallback;
123
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +0530124 /** @brief Contained timer object */
125 Timer timer;
Vishwanatha Subbanna8c5a2292017-05-30 15:34:23 +0530126
127 /** @brief Optional Callback handler on timer expirartion */
128 void timeOutHandler();
William A. Kennington III825f4982018-02-27 19:10:56 -0800129
William A. Kennington IIId1331082018-02-27 18:47:05 -0800130 /** @brief Attempt to enter the fallback watchdog or disables it */
131 void tryFallbackOrDisable();
Vishwanatha Subbannad7a3f132017-05-29 19:39:08 +0530132};
133
134} // namespace watchdog
135} // namespace phosphor