diff options
-rw-r--r-- | include/osmocom/bsc/bsc_subscr_conn_fsm.h | 2 | ||||
-rw-r--r-- | src/osmo-bsc/bsc_subscr_conn_fsm.c | 16 | ||||
-rw-r--r-- | src/osmo-bsc/lchan_rtp_fsm.c | 22 |
3 files changed, 32 insertions, 8 deletions
diff --git a/include/osmocom/bsc/bsc_subscr_conn_fsm.h b/include/osmocom/bsc/bsc_subscr_conn_fsm.h index 1a827d95c..78937353f 100644 --- a/include/osmocom/bsc/bsc_subscr_conn_fsm.h +++ b/include/osmocom/bsc/bsc_subscr_conn_fsm.h @@ -65,7 +65,7 @@ void gscon_submit_rsl_dtap(struct gsm_subscriber_connection *conn, int gscon_sigtran_send(struct gsm_subscriber_connection *conn, struct msgb *msg); 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); bool gscon_connect_mgw_to_msc(struct gsm_subscriber_connection *conn, struct gsm_lchan *for_lchan, const char *addr, uint16_t port, 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) |