aboutsummaryrefslogtreecommitdiffstats
path: root/src/osmo-bts-oc2g/misc/oc2gbts_mgr.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/osmo-bts-oc2g/misc/oc2gbts_mgr.h')
-rw-r--r--src/osmo-bts-oc2g/misc/oc2gbts_mgr.h398
1 files changed, 398 insertions, 0 deletions
diff --git a/src/osmo-bts-oc2g/misc/oc2gbts_mgr.h b/src/osmo-bts-oc2g/misc/oc2gbts_mgr.h
new file mode 100644
index 00000000..1f50fb6b
--- /dev/null
+++ b/src/osmo-bts-oc2g/misc/oc2gbts_mgr.h
@@ -0,0 +1,398 @@
+#ifndef _OC2GBTS_MGR_H
+#define _OC2GBTS_MGR_H
+
+#include <osmocom/vty/vty.h>
+#include <osmocom/vty/command.h>
+
+#include <osmocom/core/select.h>
+#include <osmocom/core/timer.h>
+
+#include <stdint.h>
+#include <gps.h>
+
+#define OC2GBTS_SENSOR_TIMER_DURATION 60
+#define OC2GBTS_PREVENT_TIMER_DURATION 15 * 60
+#define OC2GBTS_PREVENT_TIMER_SHORT_DURATION 5 * 60
+#define OC2GBTS_PREVENT_TIMER_NONE 0
+#define OC2GBTS_PREVENT_RETRY INT_MAX - 1
+
+enum BLINK_PATTERN {
+ BLINK_PATTERN_POWER_ON = 0, //hardware set
+ BLINK_PATTERN_INIT,
+ BLINK_PATTERN_NORMAL,
+ BLINK_PATTERN_EXT_LINK_MALFUNC,
+ BLINK_PATTERN_INT_PROC_MALFUNC,
+ BLINK_PATTERN_SUPPLY_VOLT_LOW,
+ BLINK_PATTERN_SUPPLY_VOLT_MIN,
+ BLINK_PATTERN_VSWR_HIGH,
+ BLINK_PATTERN_VSWR_MAX,
+ BLINK_PATTERN_TEMP_HIGH,
+ BLINK_PATTERN_TEMP_MAX,
+ BLINK_PATTERN_SUPPLY_PWR_HIGH,
+ BLINK_PATTERN_SUPPLY_PWR_MAX,
+ BLINK_PATTERN_PA_PWR_HIGH,
+ BLINK_PATTERN_PA_PWR_MAX,
+ BLINK_PATTERN_GPS_FIX_LOST,
+ BLINK_PATTERN_MAX_ITEM
+};
+
+#define BLINK_PATTERN_COMMAND {\
+ "set red; sleep 5.0",\
+ "set orange; sleep 5.0",\
+ "set green; sleep 2.5; set off; sleep 2.5",\
+ "set red; sleep 0.5; set off; sleep 0.5",\
+ "set red; sleep 2.5; set off; sleep 2.5",\
+ "set green; sleep 2.5; set off; sleep 0.5; set red; sleep 0.5; set off; sleep 0.5; set green; sleep 0.5; set off; sleep 0.5",\
+ "set red; sleep 2.5; set off; sleep 0.5; set red; sleep 0.5; set off; sleep 0.5; set green; sleep 0.5; set off; sleep 0.5 ",\
+ "set green; sleep 2.5; set off; sleep 0.5; set orange; sleep 0.5; set off; sleep 0.5; set orange; sleep 0.5; set off; sleep 0.5",\
+ "set red; sleep 2.5; set off; sleep 0.5; set orange; sleep 0.5; set off; sleep 0.5; set orange; sleep 0.5; set off; sleep 0.5",\
+ "set orange; sleep 2.5; set off; sleep 0.5; set red; sleep 0.5; set off; sleep 0.5; set red; sleep 0.5; set off; sleep 0.5 ",\
+ "set red; sleep 2.5; set off; sleep 0.5; set red; sleep 0.5; set off; sleep 0.5; set red; sleep 0.5; set off; sleep 0.5",\
+ "set green; sleep 2.5; set off; sleep 0.5; set orange; sleep 0.5; set off; sleep 0.5; set red; sleep 0.5; set off; sleep 0.5",\
+ "set red; sleep 2.5; set off; sleep 0.5; set orange; sleep 0.5; set off; sleep 0.5; set red; sleep 0.5; set off; sleep 0.5",\
+ "set green; sleep 2.5; set off; sleep 0.5; set red; sleep 0.5; set off; sleep 0.5; set orange; sleep 0.5; set off; sleep 0.5",\
+ "set red; sleep 2.5; set off; sleep 0.5; set red; sleep 0.5; set off; sleep 0.5; set orange; sleep 0.5; set off; sleep 0.5",\
+ "set green; sleep 2.5; set off; sleep 0.5; set green; sleep 0.5; set off; sleep 0.5; set orange; sleep 0.5; set off; sleep 0.5",\
+}
+
+enum {
+ DTEMP,
+ DFW,
+ DFIND,
+ DCALIB,
+ DSWD,
+};
+
+// TODO NTQD: Define new actions like reducing output power, limit ARM core speed, shutdown second TRX/PA, ...
+enum {
+#if 0
+ SENSOR_ACT_PWR_CONTRL = 0x1,
+#endif
+ SENSOR_ACT_PA_OFF = 0x2,
+ SENSOR_ACT_BTS_SRV_OFF = 0x10,
+};
+
+/* actions only for normal state */
+enum {
+#if 0
+ SENSOR_ACT_NORM_PW_CONTRL = 0x1,
+#endif
+ SENSOR_ACT_NORM_PA_ON = 0x2,
+ SENSOR_ACT_NORM_BTS_SRV_ON= 0x10,
+};
+
+enum oc2gbts_sensor_state {
+ STATE_NORMAL, /* Everything is fine */
+ STATE_WARNING_HYST, /* Go back to normal next? */
+ STATE_WARNING, /* We are above the warning threshold */
+ STATE_CRITICAL, /* We have an issue. Wait for below warning */
+};
+
+enum oc2gbts_leds_name {
+ OC2GBTS_LED_RED = 0,
+ OC2GBTS_LED_GREEN,
+ OC2GBTS_LED_ORANGE,
+ OC2GBTS_LED_OFF,
+ _OC2GBTS_LED_MAX
+};
+
+struct oc2gbts_led{
+ char *name;
+ char *fullname;
+ char *path;
+};
+
+/**
+ * Temperature Limits. We separate from a threshold
+ * that will generate a warning and one that is so
+ * severe that an action will be taken.
+ */
+struct oc2gbts_temp_limit {
+ int thresh_warn_max;
+ int thresh_crit_max;
+ int thresh_warn_min;
+};
+
+struct oc2gbts_volt_limit {
+ int thresh_warn_max;
+ int thresh_crit_max;
+ int thresh_warn_min;
+ int thresh_crit_min;
+};
+
+struct oc2gbts_pwr_limit {
+ int thresh_warn_max;
+ int thresh_crit_max;
+};
+
+struct oc2gbts_vswr_limit {
+ int thresh_warn_max;
+ int thresh_crit_max;
+};
+
+struct oc2gbts_gps_fix_limit {
+ int thresh_warn_max;
+};
+
+struct oc2gbts_sleep_time {
+ int sleep_sec;
+ int sleep_usec;
+};
+
+struct oc2gbts_led_timer {
+ uint8_t idx;
+ struct osmo_timer_list timer;
+ struct oc2gbts_sleep_time param;
+};
+
+struct oc2gbts_led_timer_list {
+ struct llist_head list;
+ struct oc2gbts_led_timer led_timer;
+};
+
+struct oc2gbts_preventive_list {
+ struct llist_head list;
+ struct oc2gbts_sleep_time param;
+ int action_flag;
+};
+
+enum mgr_vty_node {
+ MGR_NODE = _LAST_OSMOVTY_NODE + 1,
+
+ ACT_NORM_NODE,
+ ACT_WARN_NODE,
+ ACT_CRIT_NODE,
+ LIMIT_SUPPLY_TEMP_NODE,
+ LIMIT_SOC_NODE,
+ LIMIT_FPGA_NODE,
+ LIMIT_RMSDET_NODE,
+ LIMIT_OCXO_NODE,
+ LIMIT_TX_TEMP_NODE,
+ LIMIT_PA_TEMP_NODE,
+ LIMIT_SUPPLY_VOLT_NODE,
+ LIMIT_VSWR_NODE,
+ LIMIT_SUPPLY_PWR_NODE,
+ LIMIT_PA_PWR_NODE,
+ LIMIT_GPS_FIX_NODE,
+};
+
+enum mgr_vty_limit_type {
+ MGR_LIMIT_TYPE_TEMP = 0,
+ MGR_LIMIT_TYPE_VOLT,
+ MGR_LIMIT_TYPE_VSWR,
+ MGR_LIMIT_TYPE_PWR,
+ _MGR_LIMIT_TYPE_MAX,
+};
+
+struct oc2gbts_mgr_instance {
+ const char *config_file;
+
+ struct {
+ struct oc2gbts_temp_limit supply_temp_limit;
+ struct oc2gbts_temp_limit soc_temp_limit;
+ struct oc2gbts_temp_limit fpga_temp_limit;
+ struct oc2gbts_temp_limit rmsdet_temp_limit;
+ struct oc2gbts_temp_limit ocxo_temp_limit;
+ struct oc2gbts_temp_limit tx_temp_limit;
+ struct oc2gbts_temp_limit pa_temp_limit;
+ } temp;
+
+ struct {
+ struct oc2gbts_volt_limit supply_volt_limit;
+ } volt;
+
+ struct {
+ struct oc2gbts_pwr_limit supply_pwr_limit;
+ struct oc2gbts_pwr_limit pa_pwr_limit;
+ } pwr;
+
+ struct {
+ struct oc2gbts_vswr_limit vswr_limit;
+ int last_vswr;
+ } vswr;
+
+ struct {
+ struct oc2gbts_gps_fix_limit gps_fix_limit;
+ int last_update;
+ time_t last_gps_fix;
+ time_t gps_fix_now;
+ int gps_open;
+ struct osmo_fd gpsfd;
+ struct gps_data_t gpsdata;
+ struct osmo_timer_list fix_timeout;
+ } gps;
+
+ struct {
+ int action_norm;
+ int action_warn;
+ int action_crit;
+ int action_comb;
+
+ enum oc2gbts_sensor_state state;
+ } state;
+
+ struct {
+ int state;
+ int calib_from_loop;
+ struct osmo_timer_list calib_timeout;
+ } calib;
+
+ struct {
+ int state;
+ int swd_from_loop;
+ unsigned long long int swd_events;
+ unsigned long long int swd_events_cache;
+ unsigned long long int swd_eventmasks;
+ int num_events;
+ struct osmo_timer_list swd_timeout;
+ } swd;
+
+ struct {
+ uint8_t led_idx;
+ uint8_t last_pattern_id;
+ uint8_t active_timer;
+ struct llist_head list;
+ } oc2gbts_leds;
+
+ struct {
+ int is_up;
+ uint32_t last_seqno;
+ struct osmo_timer_list recon_timer;
+ struct ipa_client_conn *bts_conn;
+ uint32_t crit_flags;
+ uint32_t warn_flags;
+ } oc2gbts_ctrl;
+
+ struct oc2gbts_alarms {
+ int temp_high;
+ int temp_max;
+ int supply_low;
+ int supply_min;
+ int vswr_high;
+ int vswr_max;
+ int supply_pwr_high;
+ int supply_pwr_max;
+ int pa_pwr_high;
+ int pa_pwr_max;
+ int gps_fix_lost;
+ struct llist_head list;
+ struct osmo_timer_list preventive_timer;
+ int preventive_duration;
+ int preventive_retry;
+ } alarms;
+
+};
+
+enum oc2gbts_mgr_fail_evt_rep_crit_sig {
+ /* Critical alarms */
+ S_MGR_TEMP_SUPPLY_CRIT_MAX_ALARM = (1 << 0),
+ S_MGR_TEMP_SOC_CRIT_MAX_ALARM = (1 << 1),
+ S_MGR_TEMP_FPGA_CRIT_MAX_ALARM = (1 << 2),
+ S_MGR_TEMP_RMS_DET_CRIT_MAX_ALARM = (1 << 3),
+ S_MGR_TEMP_OCXO_CRIT_MAX_ALARM = (1 << 4),
+ S_MGR_TEMP_TRX_CRIT_MAX_ALARM = (1 << 5),
+ S_MGR_TEMP_PA_CRIT_MAX_ALARM = (1 << 6),
+ S_MGR_SUPPLY_CRIT_MAX_ALARM = (1 << 7),
+ S_MGR_SUPPLY_CRIT_MIN_ALARM = (1 << 8),
+ S_MGR_VSWR_CRIT_MAX_ALARM = (1 << 9),
+ S_MGR_PWR_SUPPLY_CRIT_MAX_ALARM = (1 << 10),
+ S_MGR_PWR_PA_CRIT_MAX_ALARM = (1 << 11),
+ _S_MGR_CRIT_ALARM_MAX,
+};
+
+enum oc2gbts_mgr_fail_evt_rep_warn_sig {
+ /* Warning alarms */
+ S_MGR_TEMP_SUPPLY_WARN_MIN_ALARM = (1 << 0),
+ S_MGR_TEMP_SUPPLY_WARN_MAX_ALARM = (1 << 1),
+ S_MGR_TEMP_SOC_WARN_MIN_ALARM = (1 << 2),
+ S_MGR_TEMP_SOC_WARN_MAX_ALARM = (1 << 3),
+ S_MGR_TEMP_FPGA_WARN_MIN_ALARM = (1 << 4),
+ S_MGR_TEMP_FPGA_WARN_MAX_ALARM = (1 << 5),
+ S_MGR_TEMP_RMS_DET_WARN_MIN_ALARM = (1 << 6),
+ S_MGR_TEMP_RMS_DET_WARN_MAX_ALARM = (1 << 7),
+ S_MGR_TEMP_OCXO_WARN_MIN_ALARM = (1 << 8),
+ S_MGR_TEMP_OCXO_WARN_MAX_ALARM = (1 << 9),
+ S_MGR_TEMP_TRX_WARN_MIN_ALARM = (1 << 10),
+ S_MGR_TEMP_TRX_WARN_MAX_ALARM = (1 << 11),
+ S_MGR_TEMP_PA_WARN_MIN_ALARM = (1 << 12),
+ S_MGR_TEMP_PA_WARN_MAX_ALARM = (1 << 13),
+ S_MGR_SUPPLY_WARN_MIN_ALARM = (1 << 14),
+ S_MGR_SUPPLY_WARN_MAX_ALARM = (1 << 15),
+ S_MGR_VSWR_WARN_MAX_ALARM = (1 << 16),
+ S_MGR_PWR_SUPPLY_WARN_MAX_ALARM = (1 << 17),
+ S_MGR_PWR_PA_WARN_MAX_ALARM = (1 << 18),
+ S_MGR_GPS_FIX_WARN_ALARM = (1 << 19),
+ _S_MGR_WARN_ALARM_MAX,
+};
+
+enum oc2gbts_mgr_failure_event_causes {
+ /* Critical causes */
+ NM_EVT_CAUSE_CRIT_TEMP_SUPPLY_MAX_FAIL = 0x4100,
+ NM_EVT_CAUSE_CRIT_TEMP_FPGA_MAX_FAIL = 0x4101,
+ NM_EVT_CAUSE_CRIT_TEMP_SOC_MAX_FAIL = 0x4102,
+ NM_EVT_CAUSE_CRIT_TEMP_RMS_DET_MAX_FAIL = 0x4103,
+ NM_EVT_CAUSE_CRIT_TEMP_OCXO_MAX_FAIL = 0x4104,
+ NM_EVT_CAUSE_CRIT_TEMP_TRX_MAX_FAIL = 0x4105,
+ NM_EVT_CAUSE_CRIT_TEMP_PA_MAX_FAIL = 0x4106,
+ NM_EVT_CAUSE_CRIT_SUPPLY_MAX_FAIL = 0x4107,
+ NM_EVT_CAUSE_CRIT_SUPPLY_MIN_FAIL = 0x4108,
+ NM_EVT_CAUSE_CRIT_VSWR_MAX_FAIL = 0x4109,
+ NM_EVT_CAUSE_CRIT_PWR_SUPPLY_MAX_FAIL = 0x410A,
+ NM_EVT_CAUSE_CRIT_PWR_PA_MAX_FAIL = 0x410B,
+ /* Warning causes */
+ NM_EVT_CAUSE_WARN_TEMP_SUPPLY_LOW_FAIL = 0x4400,
+ NM_EVT_CAUSE_WARN_TEMP_SUPPLY_HIGH_FAIL = 0x4401,
+ NM_EVT_CAUSE_WARN_TEMP_FPGA_LOW_FAIL = 0x4402,
+ NM_EVT_CAUSE_WARN_TEMP_FPGA_HIGH_FAIL = 0x4403,
+ NM_EVT_CAUSE_WARN_TEMP_SOC_LOW_FAIL = 0x4404,
+ NM_EVT_CAUSE_WARN_TEMP_SOC_HIGH_FAIL = 0x4405,
+ NM_EVT_CAUSE_WARN_TEMP_RMS_DET_LOW_FAIL = 0x4406,
+ NM_EVT_CAUSE_WARN_TEMP_RMS_DET_HIGH_FAIL= 0x4407,
+ NM_EVT_CAUSE_WARN_TEMP_OCXO_LOW_FAIL = 0x4408,
+ NM_EVT_CAUSE_WARN_TEMP_OCXO_HIGH_FAIL = 0x4409,
+ NM_EVT_CAUSE_WARN_TEMP_TRX_LOW_FAIL = 0x440A,
+ NM_EVT_CAUSE_WARN_TEMP_TRX_HIGH_FAIL = 0x440B,
+ NM_EVT_CAUSE_WARN_TEMP_PA_LOW_FAIL = 0x440C,
+ NM_EVT_CAUSE_WARN_TEMP_PA_HIGH_FAIL = 0x440D,
+ NM_EVT_CAUSE_WARN_SUPPLY_LOW_FAIL = 0x440E,
+ NM_EVT_CAUSE_WARN_SUPPLY_HIGH_FAIL = 0x440F,
+ NM_EVT_CAUSE_WARN_VSWR_HIGH_FAIL = 0x4410,
+ NM_EVT_CAUSE_WARN_PWR_SUPPLY_HIGH_FAIL = 0x4411,
+ NM_EVT_CAUSE_WARN_PWR_PA_HIGH_FAIL = 0x4412,
+ NM_EVT_CAUSE_WARN_GPS_FIX_FAIL = 0x4413,
+};
+
+/* This defines the list of notification events for systemd service watchdog.
+ all these events must be notified in a certain service defined timeslot
+ or the service (this app) would be restarted (only if related systemd service
+ unit file has WatchdogSec!=0).
+ WARNING: swd events must begin with event 0. Last events must be
+ SWD_LAST (max 64 events in this list).
+*/
+enum mgr_swd_events {
+ SWD_MAINLOOP = 0,
+ SWD_CHECK_SENSOR,
+ SWD_UPDATE_HOURS,
+ SWD_CHECK_TEMP_SENSOR,
+ SWD_CHECK_LED_CTRL,
+ SWD_CHECK_CALIB,
+ SWD_CHECK_BTS_CONNECTION,
+ SWD_LAST
+};
+
+int oc2gbts_mgr_vty_init(void);
+int oc2gbts_mgr_parse_config(struct oc2gbts_mgr_instance *mgr);
+int oc2gbts_mgr_nl_init(void);
+int oc2gbts_mgr_sensor_init(struct oc2gbts_mgr_instance *mgr);
+const char *oc2gbts_mgr_sensor_get_state(enum oc2gbts_sensor_state state);
+
+int oc2gbts_mgr_calib_init(struct oc2gbts_mgr_instance *mgr);
+int oc2gbts_mgr_control_init(struct oc2gbts_mgr_instance *mgr);
+int oc2gbts_mgr_calib_run(struct oc2gbts_mgr_instance *mgr);
+void oc2gbts_mgr_dispatch_alarm(struct oc2gbts_mgr_instance *mgr, const int cause, const char *key, const char *text);
+void handle_alert_actions(struct oc2gbts_mgr_instance *mgr);
+void handle_ceased_actions(struct oc2gbts_mgr_instance *mgr);
+void handle_warn_actions(struct oc2gbts_mgr_instance *mgr);
+extern void *tall_mgr_ctx;
+
+#endif