aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/osmo-bsc/bsc_subscr_conn_fsm.c16
-rw-r--r--src/osmo-bsc/lchan_rtp_fsm.c22
2 files changed, 31 insertions, 7 deletions
diff --git a/src/osmo-bsc/bsc_subscr_conn_fsm.c b/src/osmo-bsc/bsc_subscr_conn_fsm.c
index 9b1fb3fde..0faf3b2df 100644
--- a/src/osmo-bsc/bsc_subscr_conn_fsm.c
+++ b/src/osmo-bsc/bsc_subscr_conn_fsm.c
@@ -471,8 +471,10 @@ static bool same_mgw_info(const struct mgcp_conn_peer *a, const struct mgcp_conn
* SCCPlite, pass in msc_assigned_cic the CIC received upon BSSMAP Assignment Command or BSSMAP Handover
* Request form the MSC (which is only stored in conn->user_plane after success). Ignored for AoIP. */
struct osmo_mgcpc_ep *gscon_ensure_mgw_endpoint(struct gsm_subscriber_connection *conn,
- uint16_t msc_assigned_cic)
+ uint16_t msc_assigned_cic, struct gsm_lchan *for_lchan)
{
+ const char *epname;
+
if (conn->user_plane.mgw_endpoint)
return conn->user_plane.mgw_endpoint;
@@ -489,13 +491,19 @@ struct osmo_mgcpc_ep *gscon_ensure_mgw_endpoint(struct gsm_subscriber_connection
msc_assigned_cic, osmo_mgcpc_ep_name(conn->user_plane.mgw_endpoint));
} else if (gscon_is_aoip(conn)) {
- /* use dynamic RTPBRIDGE endpoint allocation in MGW */
+
+ if (is_ipaccess_bts(for_lchan->ts->trx->bts))
+ /* use dynamic RTPBRIDGE endpoint allocation in MGW */
+ epname = mgcp_client_rtpbridge_wildcard(conn->network->mgw.client);
+ else
+ epname = mgcp_client_e1_epname(conn, conn->network->mgw.client, 1, for_lchan->ts->e1_link.e1_ts, 16, for_lchan->ts->e1_link.e1_ts_ss*2);
+
conn->user_plane.mgw_endpoint =
osmo_mgcpc_ep_alloc(conn->fi, GSCON_EV_FORGET_MGW_ENDPOINT,
conn->network->mgw.client,
conn->network->mgw.tdefs,
conn->fi->id,
- "%s", mgcp_client_rtpbridge_wildcard(conn->network->mgw.client));
+ "%s", epname);
} else {
LOGPFSML(conn->fi, LOGL_ERROR, "Conn is neither SCCPlite nor AoIP!?\n");
return NULL;
@@ -570,7 +578,7 @@ bool gscon_connect_mgw_to_msc(struct gsm_subscriber_connection *conn,
} else
verb = MGCP_VERB_CRCX;
- gscon_ensure_mgw_endpoint(conn, for_lchan->activate.info.msc_assigned_cic);
+ gscon_ensure_mgw_endpoint(conn, for_lchan->activate.info.msc_assigned_cic, for_lchan);
if (!conn->user_plane.mgw_endpoint) {
LOGPFSML(conn->fi, LOGL_ERROR, "Unable to allocate endpoint info\n");
diff --git a/src/osmo-bsc/lchan_rtp_fsm.c b/src/osmo-bsc/lchan_rtp_fsm.c
index 24a714702..1fe545286 100644
--- a/src/osmo-bsc/lchan_rtp_fsm.c
+++ b/src/osmo-bsc/lchan_rtp_fsm.c
@@ -141,6 +141,12 @@ static void lchan_rtp_fsm_wait_mgw_endpoint_available_onenter(struct osmo_fsm_in
struct osmo_mgcpc_ep_ci *use_mgwep_ci = lchan_use_mgw_endpoint_ci_bts(lchan);
struct mgcp_conn_peer crcx_info = {};
+ if (!is_ipaccess_bts(lchan->ts->trx->bts)) {
+ LOG_LCHAN_RTP(lchan, LOGL_DEBUG, "Audio link to-BTS via E1, skipping IPACC\n");
+ lchan_rtp_fsm_state_chg(LCHAN_RTP_ST_WAIT_LCHAN_READY);
+ return;
+ }
+
if (use_mgwep_ci) {
LOG_LCHAN_RTP(lchan, LOGL_DEBUG, "MGW endpoint already available: %s\n",
osmo_mgcpc_ep_ci_name(use_mgwep_ci));
@@ -148,7 +154,7 @@ static void lchan_rtp_fsm_wait_mgw_endpoint_available_onenter(struct osmo_fsm_in
return;
}
- mgwep = gscon_ensure_mgw_endpoint(lchan->conn, lchan->activate.info.msc_assigned_cic);
+ mgwep = gscon_ensure_mgw_endpoint(lchan->conn, lchan->activate.info.msc_assigned_cic, lchan);
if (!mgwep) {
lchan_rtp_fail("Internal error: cannot obtain MGW endpoint handle for conn");
return;
@@ -248,7 +254,7 @@ static void lchan_rtp_fsm_post_lchan_ready(struct osmo_fsm_inst *fi)
if (is_ipaccess_bts(lchan->ts->trx->bts))
lchan_rtp_fsm_state_chg(LCHAN_RTP_ST_WAIT_IPACC_CRCX_ACK);
else
- lchan_rtp_fsm_switch_rtp(fi);
+ lchan_rtp_fsm_state_chg(LCHAN_RTP_ST_WAIT_MGW_ENDPOINT_CONFIGURED);
}
static void lchan_rtp_fsm_wait_ipacc_crcx_ack_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)
@@ -445,6 +451,12 @@ static void lchan_rtp_fsm_wait_mgw_endpoint_configured_onenter(struct osmo_fsm_i
return;
}
+ if (!is_ipaccess_bts(lchan->ts->trx->bts)) {
+ LOG_LCHAN_RTP(lchan, LOGL_DEBUG, "Audio link to-BTS via E1, skipping IPACC\n");
+ lchan_rtp_fsm_state_chg(LCHAN_RTP_ST_READY);
+ return;
+ }
+
/* At this point, we are taking over an old lchan's MGW endpoint (if any). */
if (!lchan->mgw_endpoint_ci_bts && old_lchan) {
/* The old lchan shall forget the endpoint now. We might put it back upon ROLLBACK */
@@ -521,7 +533,11 @@ static void lchan_rtp_fsm_rollback_onenter(struct osmo_fsm_inst *fi, uint32_t pr
osmo_fsm_inst_term(fi, OSMO_FSM_TERM_REQUEST, 0);
return;
}
- connect_mgw_endpoint_to_lchan(fi, lchan->mgw_endpoint_ci_bts, old_lchan);
+
+ if (is_ipaccess_bts(lchan->ts->trx->bts))
+ connect_mgw_endpoint_to_lchan(fi, lchan->mgw_endpoint_ci_bts, old_lchan);
+ else
+ osmo_fsm_inst_dispatch(fi, LCHAN_RTP_EV_MGW_ENDPOINT_CONFIGURED, 0);
}
static void lchan_rtp_fsm_rollback(struct osmo_fsm_inst *fi, uint32_t event, void *data)