jolly has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmo-abis/+/31033 )
Change subject: Add L1 signals to misdn driver ......................................................................
Add L1 signals to misdn driver
Change-Id: Id8b6fad9b073cf92eee92a6906bf5b57af37e2f0 --- M include/mISDNif.h M src/input/misdn.c 2 files changed, 78 insertions(+), 0 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmo-abis refs/changes/33/31033/1
diff --git a/include/mISDNif.h b/include/mISDNif.h index 8e065d2..4a12eea 100644 --- a/include/mISDNif.h +++ b/include/mISDNif.h @@ -193,6 +193,8 @@ #define L1_SIGNAL_RDI_ON 0x0015 #define L1_SIGNAL_SLIP_RX 0x0020 #define L1_SIGNAL_SLIP_TX 0x0021 +#define L1_SIGNAL_SA_BITS 0x0100 +#define L1_SIGNAL_SA_MASK 0x00FF
/* * protocol ids diff --git a/src/input/misdn.c b/src/input/misdn.c index 454c8e8..815eb53 100644 --- a/src/input/misdn.c +++ b/src/input/misdn.c @@ -63,6 +63,7 @@ #include <osmocom/abis/e1_input.h> #include <osmocom/abis/lapd.h> #include <osmocom/core/talloc.h> +#include <osmocom/core/signal.h>
#define TS1_ALLOC_SIZE 300
@@ -71,6 +72,7 @@ int use_userspace_lapd; int unconfirmed_ts[NUM_E1_TS]; int dummy_dchannel; + int los, ais, rai; };
const struct value_string prim_names[] = { @@ -90,6 +92,67 @@ { 0, NULL } };
+static int mph_information_ind(struct e1inp_line *line, int info) +{ + struct misdn_line *mline = line->driver_data; + struct input_signal_data isd; + int was_alarm, is_alarm; + + memset(&isd, 0, sizeof(isd)); + isd.line = line; + + was_alarm = mline->los || mline->ais || mline->rai; + + if ((info & ~L1_SIGNAL_SA_MASK) == L1_SIGNAL_SA_BITS) { + isd.sa_bits = info & L1_SIGNAL_SA_MASK; + LOGP(DLMI, LOGL_DEBUG, "L1_SIGNAL_SA_BITS = 0x%02x\n", isd.sa_bits); + osmo_signal_dispatch(SS_L_INPUT, S_L_INP_LINE_SA_BITS, &isd); + } else + switch(info) { + case L1_SIGNAL_LOS_OFF: + LOGP(DLMI, LOGL_DEBUG, "L1_SIGNAL_LOS_OFF\n"); + osmo_signal_dispatch(SS_L_INPUT, S_L_INP_LINE_NOLOS, &isd); + mline->los = 0; + break; + case L1_SIGNAL_LOS_ON: + LOGP(DLMI, LOGL_DEBUG, "L1_SIGNAL_LOS_ON\n"); + osmo_signal_dispatch(SS_L_INPUT, S_L_INP_LINE_LOS, &isd); + mline->los = 1; + break; + case L1_SIGNAL_AIS_OFF: + LOGP(DLMI, LOGL_DEBUG, "L1_SIGNAL_AIS_OFF\n"); + osmo_signal_dispatch(SS_L_INPUT, S_L_INP_LINE_NOAIS, &isd); + mline->ais = 0; + break; + case L1_SIGNAL_AIS_ON: + LOGP(DLMI, LOGL_DEBUG, "L1_SIGNAL_AIS_ON\n"); + osmo_signal_dispatch(SS_L_INPUT, S_L_INP_LINE_AIS, &isd); + mline->ais = 1; + break; + case L1_SIGNAL_RDI_OFF: + LOGP(DLMI, LOGL_DEBUG, "L1_SIGNAL_RDI_OFF\n"); + osmo_signal_dispatch(SS_L_INPUT, S_L_INP_LINE_NORAI, &isd); + mline->rai = 0; + break; + case L1_SIGNAL_RDI_ON: + LOGP(DLMI, LOGL_DEBUG, "L1_SIGNAL_RDI_ON\n"); + osmo_signal_dispatch(SS_L_INPUT, S_L_INP_LINE_RAI, &isd); + mline->rai = 1; + break; + default: + LOGP(DLMI, LOGL_DEBUG, "Unknown MPH_INFORMATION_IND: 0x%04x\n", info); + } + + is_alarm = mline->los || mline->ais || mline->rai; + + if (!was_alarm && is_alarm) + osmo_signal_dispatch(SS_L_INPUT, S_L_INP_LINE_ALARM, &isd); + if (was_alarm && !is_alarm) + osmo_signal_dispatch(SS_L_INPUT, S_L_INP_LINE_NOALARM, &isd); + + return 0; +} + static int handle_ts1_read(struct osmo_fd *bfd) { struct e1inp_line *line = bfd->data; @@ -202,6 +265,13 @@ LOGPITS(e1i_ts, DLMI, LOGL_DEBUG, "RX: %s\n", osmo_hexdump(msg->data, msg->len)); ret = e1inp_rx_ts_lapd(e1i_ts, msg); break; + case MPH_INFORMATION_IND: + LOGPITS(e1i_ts, DLMI, LOGL_DEBUG, "MPH_INFORMATION_IND\n"); + /* remove the Misdn Header */ + msgb_pull(msg, MISDN_HEADER_LEN); + mph_information_ind(line, *((int *)msg->data)); + msgb_free(msg); + break; default: msgb_free(msg); break; @@ -557,6 +627,12 @@ mline->unconfirmed_ts[ts_nr-1] = 0; osmo_fd_write_enable(bfd); break; + case MPH_INFORMATION_IND: + LOGPITS(e1i_ts, DLMI, LOGL_DEBUG, "MPH_INFORMATION_IND\n"); + /* remove the Misdn Header */ + msgb_pull(msg, MISDN_HEADER_LEN); + mph_information_ind(line, *((int *)msg->data)); + break; default: break; }