diff options
Diffstat (limited to 'openbsc/src/libabis/e1_input.c')
-rw-r--r-- | openbsc/src/libabis/e1_input.c | 61 |
1 files changed, 34 insertions, 27 deletions
diff --git a/openbsc/src/libabis/e1_input.c b/openbsc/src/libabis/e1_input.c index a6661b785..eab418a24 100644 --- a/openbsc/src/libabis/e1_input.c +++ b/openbsc/src/libabis/e1_input.c @@ -246,27 +246,21 @@ static int subch_cb(struct subch_demux *dmx, int ch, uint8_t *data, int len, return trau_mux_input(&src_ss, data, len); } -int abis_rsl_sendmsg(struct msgb *msg) +int abis_sendmsg(struct msgb *msg) { - struct e1inp_sign_link *sign_link; + struct e1inp_sign_link *sign_link = msg->dst; struct e1inp_driver *e1inp_driver; struct e1inp_ts *e1i_ts; msg->l2h = msg->data; - if (!msg->trx) { - LOGP(DRSL, LOGL_ERROR, "rsl_sendmsg: msg->trx == NULL: %s\n", + /* don't know how to route this message. */ + if (sign_link == NULL) { + LOGP(DLINP, LOGL_ERROR, "abis_sendmsg: msg->dst == NULL: %s\n", osmo_hexdump(msg->data, msg->len)); talloc_free(msg); return -EINVAL; - } else if (!msg->trx->rsl_link) { - LOGP(DRSL, LOGL_ERROR, "rsl_sendmsg: msg->trx->rsl_link == NULL: %s\n", - osmo_hexdump(msg->data, msg->len)); - talloc_free(msg); - return -EIO; } - - sign_link = msg->trx->rsl_link; e1i_ts = sign_link->ts; if (!osmo_timer_pending(&e1i_ts->sign.tx_timer)) { /* notify the driver we have something to write */ @@ -281,27 +275,20 @@ int abis_rsl_sendmsg(struct msgb *msg) return 0; } -int _abis_nm_sendmsg(struct msgb *msg, int to_trx_oml) +int abis_rsl_sendmsg(struct msgb *msg) { - struct e1inp_sign_link *sign_link; + struct e1inp_sign_link *sign_link = (struct e1inp_sign_link *)msg->dst; struct e1inp_driver *e1inp_driver; struct e1inp_ts *e1i_ts; msg->l2h = msg->data; - if (!msg->trx || !msg->trx->bts || !msg->trx->bts->oml_link) { - LOGP(DNM, LOGL_ERROR, "nm_sendmsg: msg->trx == NULL\n"); + if (!sign_link) { + LOGP(DRSL, LOGL_ERROR, "rsl_sendmsg: msg->dst == NULL: %s\n", + osmo_hexdump(msg->data, msg->len)); + talloc_free(msg); return -EINVAL; } - - /* Check for TRX-specific OML link first */ - if (to_trx_oml) { - if (!msg->trx->oml_link) - return -ENODEV; - sign_link = msg->trx->oml_link; - } else - sign_link = msg->trx->bts->oml_link; - e1i_ts = sign_link->ts; if (!osmo_timer_pending(&e1i_ts->sign.tx_timer)) { /* notify the driver we have something to write */ @@ -316,6 +303,26 @@ int _abis_nm_sendmsg(struct msgb *msg, int to_trx_oml) return 0; } +int _abis_nm_sendmsg(struct msgb *msg, int to_trx_oml) +{ + struct e1inp_sign_link *sign_link = msg->dst; + + msg->l2h = msg->data; + + if (!msg->dst) { + LOGP(DNM, LOGL_ERROR, "_abis_nm_sendmsg: msg->dst == NULL\n"); + return -EINVAL; + } + + /* Check for TRX-specific OML link first */ + if (to_trx_oml) { + if (!sign_link->trx->oml_link) + return -ENODEV; + msg->dst = sign_link->trx->oml_link; + } + return abis_sendmsg(msg); +} + /* Timeslot */ /* configure and initialize one e1inp_ts */ @@ -527,12 +534,12 @@ int e1inp_rx_ts(struct e1inp_ts *ts, struct msgb *msg, log_set_context(BSC_CTX_BTS, link->trx->bts); switch (link->type) { case E1INP_SIGN_OML: - msg->trx = link->trx; - bts = msg->trx->bts; + msg->dst = link; + bts = link->trx->bts; ret = bts->model->oml_rcvmsg(msg); break; case E1INP_SIGN_RSL: - msg->trx = link->trx; + msg->dst = link; ret = abis_rsl_rcvmsg(msg); break; default: |