aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorHarald Welte <laforge@osmocom.org>2019-11-06 16:44:04 +0100
committerHarald Welte <laforge@osmocom.org>2019-12-04 14:15:47 +0100
commit8486938efb80b94cdf723056c8769627380881f6 (patch)
tree79745c0dc656951f07e8654dc349dbebd5336f2a /src
parent1b41abda3d6df5138d6f97cc497d54a6c84d0d63 (diff)
e1_recorder: Skip storing data to disk if line is in ALARM state
Diffstat (limited to 'src')
-rw-r--r--src/e1_recorder.c30
-rw-r--r--src/recorder.h1
2 files changed, 31 insertions, 0 deletions
diff --git a/src/e1_recorder.c b/src/e1_recorder.c
index 82558b2..333375d 100644
--- a/src/e1_recorder.c
+++ b/src/e1_recorder.c
@@ -31,6 +31,29 @@ static enum osmo_e1cap_capture_mode ts2cap_mode(struct e1inp_ts *ts)
}
}
+static int sig_inp_cbfn(unsigned int subsys, unsigned int signal, void *handler_data, void *signal_data)
+{
+ struct input_signal_data *isd = signal_data;
+ struct e1_recorder_line *rline;
+
+ OSMO_ASSERT(subsys == SS_L_INPUT);
+ OSMO_ASSERT(isd->line && isd->line->num < ARRAY_SIZE(g_recorder.line));
+
+ switch (signal) {
+ case S_L_INP_LINE_ALARM:
+ LOGP(DMAIN, LOGL_NOTICE, "Line %u: ALARM\n", isd->line->num);
+ rline = &g_recorder.line[isd->line->num];
+ rline->has_alarm = true;
+ break;
+ case S_L_INP_LINE_NOALARM:
+ LOGP(DMAIN, LOGL_NOTICE, "Line %u: NOALARM\n", isd->line->num);
+ rline = &g_recorder.line[isd->line->num];
+ rline->has_alarm = false;
+ break;
+ }
+ return 0;
+}
+
/* receive a raw message frome the E1 timeslot */
void e1ts_raw_recv(struct e1inp_ts *ts, struct msgb *msg)
{
@@ -38,6 +61,11 @@ void e1ts_raw_recv(struct e1inp_ts *ts, struct msgb *msg)
enum osmo_e1cap_capture_mode cap_mode = ts2cap_mode(ts);
int rc;
+ if (rline->has_alarm) {
+ DEBUGP(DMAIN, "Skipping storage as line %u is in ALARM\n", ts->line->num);
+ return;
+ }
+
/* FIXME: special processing of TFP and PGSL */
rc = e1frame_store(ts, msg, cap_mode);
@@ -170,6 +198,8 @@ int main(int argc, char **argv)
handle_options(argc, argv);
+ osmo_signal_register_handler(SS_L_INPUT, sig_inp_cbfn, NULL);
+
rc = vty_read_config_file(g_config_file, NULL);
if (rc < 0) {
fprintf(stderr, "Cannot parse configuration file '%s': %s\n", g_config_file,
diff --git a/src/recorder.h b/src/recorder.h
index 12bc993..458fb1d 100644
--- a/src/recorder.h
+++ b/src/recorder.h
@@ -17,6 +17,7 @@ enum rec_vty_node {
};
struct e1_recorder_line {
+ bool has_alarm;
struct {
bool enabled;
uint8_t line_nr;