diff options
author | Andreas Eversberg <jolly@eversberg.eu> | 2014-01-20 13:08:21 +0100 |
---|---|---|
committer | Andreas Eversberg <jolly@eversberg.eu> | 2014-04-06 08:58:32 +0200 |
commit | e5beda8f83fcac0efaf783ba66e4409fa326a7c4 (patch) | |
tree | 59dd272ff5f2d68f4e4d6f0f38a11a112f4c2aaa /src/common/abis.c | |
parent | 96735bb4c95091e2d645e4c22c7d34290e2c3e1e (diff) |
ABIS: Support of multiple RSL connections for ABIS/ipaccess
Diffstat (limited to 'src/common/abis.c')
-rw-r--r-- | src/common/abis.c | 43 |
1 files changed, 28 insertions, 15 deletions
diff --git a/src/common/abis.c b/src/common/abis.c index c0565800..1f234ff4 100644 --- a/src/common/abis.c +++ b/src/common/abis.c @@ -71,6 +71,8 @@ static struct e1inp_sign_link *sign_link_up(void *unit, struct e1inp_line *line, enum e1inp_sign_type type) { struct e1inp_sign_link *sign_link = NULL; + struct gsm_bts_trx *trx; + uint8_t trx_nr; switch (type) { case E1INP_SIGN_OML: @@ -81,16 +83,22 @@ static struct e1inp_sign_link *sign_link_up(void *unit, struct e1inp_line *line, sign_link->trx = g_bts->c0; bts_link_estab(g_bts); break; - case E1INP_SIGN_RSL: - LOGP(DABIS, LOGL_INFO, "RSL Signalling link up\n"); - sign_link = g_bts->c0->rsl_link = - e1inp_sign_link_create(&line->ts[E1INP_SIGN_RSL-1], - E1INP_SIGN_RSL, NULL, 0, 0); - /* FIXME: This assumes there is only one TRX! */ - sign_link->trx = g_bts->c0; - trx_link_estab(sign_link->trx); - break; default: + trx_nr = type - E1INP_SIGN_RSL; + LOGP(DABIS, LOGL_INFO, "RSL Signalling link for TRX %d up\n", + trx_nr); + trx = gsm_bts_trx_num(g_bts, trx_nr); + if (!trx) { + LOGP(DABIS, LOGL_ERROR, "TRX #%d does not exits\n", + trx_nr); + break; + } + e1inp_ts_config_sign(&line->ts[type-1], line); + sign_link = trx->rsl_link = + e1inp_sign_link_create(&line->ts[type-1], + E1INP_SIGN_RSL, NULL, 0, 0); + sign_link->trx = trx; + trx_link_estab(trx); break; } @@ -99,12 +107,16 @@ static struct e1inp_sign_link *sign_link_up(void *unit, struct e1inp_line *line, static void sign_link_down(struct e1inp_line *line) { + struct gsm_bts_trx *trx; + LOGP(DABIS, LOGL_ERROR, "Signalling link down\n"); - if (g_bts->c0->rsl_link) { - e1inp_sign_link_destroy(g_bts->c0->rsl_link); - g_bts->c0->rsl_link = NULL; - trx_link_estab(g_bts->c0); + llist_for_each_entry(trx, &g_bts->trx_list, list) { + if (trx->rsl_link) { + e1inp_sign_link_destroy(trx->rsl_link); + trx->rsl_link = NULL; + trx_link_estab(trx); + } } if (g_bts->oml_link) @@ -225,9 +237,10 @@ static struct e1inp_line_ops line_ops = { * global initialization as well as the actual opening of the A-bis link * */ struct e1inp_line *abis_open(struct gsm_bts *bts, const char *dst_host, - const char *model_name) + const char *model_name, int trx_num) { struct e1inp_line *line; + int i; g_bts = bts; @@ -251,7 +264,7 @@ struct e1inp_line *abis_open(struct gsm_bts *bts, const char *dst_host, return NULL; e1inp_line_bind_ops(line, &line_ops); e1inp_ts_config_sign(&line->ts[E1INP_SIGN_OML-1], line); - for (i = 0; i < num_trx; i++) + for (i = 0; i < trx_num; i++) e1inp_ts_config_sign(&line->ts[E1INP_SIGN_RSL-1+i], line); /* This is what currently starts both the outbound OML and RSL |