aboutsummaryrefslogtreecommitdiffstats
path: root/src/e1_input.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/e1_input.c')
-rw-r--r--src/e1_input.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/e1_input.c b/src/e1_input.c
index df990d5..75ae36e 100644
--- a/src/e1_input.c
+++ b/src/e1_input.c
@@ -217,6 +217,7 @@ const struct value_string e1inp_ts_type_names[5] = {
{ E1INP_TS_TYPE_NONE, "None" },
{ E1INP_TS_TYPE_SIGN, "Signalling" },
{ E1INP_TS_TYPE_TRAU, "TRAU" },
+ { E1INP_TS_TYPE_RAW, "RAW" },
{ 0, NULL }
};
@@ -299,6 +300,21 @@ int e1inp_ts_config_sign(struct e1inp_ts *ts, struct e1inp_line *line)
return 0;
}
+int e1inp_ts_config_raw(struct e1inp_ts *ts, struct e1inp_line *line,
+ void (*raw_recv_cb)(struct e1inp_ts *ts,
+ struct msgb *msg))
+{
+ if (ts->type == E1INP_TS_TYPE_RAW && ts->line && line)
+ return 0;
+
+ ts->type = E1INP_TS_TYPE_RAW;
+ ts->line = line;
+ ts->raw.recv_cb = raw_recv_cb;
+ INIT_LLIST_HEAD(&ts->raw.tx_queue);
+
+ return 0;
+}
+
struct e1inp_line *e1inp_line_find(uint8_t e1_nr)
{
struct e1inp_line *e1i_line;
@@ -531,6 +547,9 @@ int e1inp_rx_ts(struct e1inp_ts *ts, struct msgb *msg,
ret = subch_demux_in(&ts->trau.demux, msg->l2h, msgb_l2len(msg));
msgb_free(msg);
break;
+ case E1INP_TS_TYPE_RAW:
+ ts->raw.recv_cb(ts, msg);
+ break;
default:
ret = -EINVAL;
LOGP(DLMI, LOGL_ERROR, "unknown TS type %u\n", ts->type);
@@ -654,6 +673,10 @@ struct msgb *e1inp_tx_ts(struct e1inp_ts *e1i_ts,
}
msgb_put(msg, 40);
break;
+ case E1INP_TS_TYPE_RAW:
+ /* Get msgb from tx_queue */
+ msg = msgb_dequeue(&e1i_ts->raw.tx_queue);
+ break;
default:
LOGP(DLMI, LOGL_ERROR, "unsupported E1 TS type %u\n", e1i_ts->type);
return NULL;