diff options
-rw-r--r-- | include/osmocom/bsc/gsm_data.h | 1 | ||||
-rw-r--r-- | src/osmo-bsc/abis_rsl.c | 4 | ||||
-rw-r--r-- | src/osmo-bsc/assignment_fsm.c | 2 | ||||
-rw-r--r-- | src/osmo-bsc/lchan_fsm.c | 14 | ||||
-rw-r--r-- | src/osmo-bsc/lchan_rtp_fsm.c | 12 |
5 files changed, 20 insertions, 13 deletions
diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h index 06702322a..61e52f6c3 100644 --- a/include/osmocom/bsc/gsm_data.h +++ b/include/osmocom/bsc/gsm_data.h @@ -645,6 +645,7 @@ struct gsm_lchan { struct { struct lchan_activate_info info; + struct channel_mode_and_rate ch_mode_rate; struct gsm48_multi_rate_conf mr_conf_filtered; bool activ_ack; /*< true as soon as RSL Chan Activ Ack is received */ bool immediate_assignment_sent; diff --git a/src/osmo-bsc/abis_rsl.c b/src/osmo-bsc/abis_rsl.c index 001b1da04..40bfcec5e 100644 --- a/src/osmo-bsc/abis_rsl.c +++ b/src/osmo-bsc/abis_rsl.c @@ -534,7 +534,7 @@ int rsl_tx_chan_activ(struct gsm_lchan *lchan, uint8_t act_type, uint8_t ho_ref) /* PDCH activation is a job for rsl_tx_dyn_ts_pdch_act_deact(); */ OSMO_ASSERT(act_type != RSL_ACT_OSMO_PDCH); - rc = channel_mode_from_lchan(&cm, lchan, &lchan->activate.info.ch_mode_rate, false); + rc = channel_mode_from_lchan(&cm, lchan, &lchan->activate.ch_mode_rate, false); if (rc < 0) { LOGP(DRSL, LOGL_ERROR, "%s Cannot find channel mode from lchan type\n", @@ -608,7 +608,7 @@ int rsl_tx_chan_activ(struct gsm_lchan *lchan, uint8_t act_type, uint8_t ho_ref) add_power_control_params(msg, RSL_IE_BS_POWER_PARAM, lchan); add_power_control_params(msg, RSL_IE_MS_POWER_PARAM, lchan); - if (gsm48_chan_mode_to_non_vamos(lchan->activate.info.ch_mode_rate.chan_mode) == GSM48_CMODE_SPEECH_AMR) { + if (gsm48_chan_mode_to_non_vamos(lchan->activate.ch_mode_rate.chan_mode) == GSM48_CMODE_SPEECH_AMR) { rc = put_mr_config_for_bts(msg, &lchan->activate.mr_conf_filtered, (lchan->type == GSM_LCHAN_TCH_F) ? &bts->mr_full : &bts->mr_half); if (rc) { diff --git a/src/osmo-bsc/assignment_fsm.c b/src/osmo-bsc/assignment_fsm.c index a15807acb..65cd8a825 100644 --- a/src/osmo-bsc/assignment_fsm.c +++ b/src/osmo-bsc/assignment_fsm.c @@ -210,7 +210,7 @@ static void send_assignment_complete(struct gsm_subscriber_connection *conn) if (gscon_is_aoip(conn)) { /* Extrapolate speech codec from speech mode */ gsm0808_speech_codec_from_chan_type(&sc, perm_spch); - sc.cfg = conn->lchan->activate.info.ch_mode_rate.s15_s0; + sc.cfg = conn->lchan->activate.ch_mode_rate.s15_s0; sc_ptr = ≻ } } diff --git a/src/osmo-bsc/lchan_fsm.c b/src/osmo-bsc/lchan_fsm.c index b486b4020..3b6333d8f 100644 --- a/src/osmo-bsc/lchan_fsm.c +++ b/src/osmo-bsc/lchan_fsm.c @@ -639,8 +639,11 @@ static void lchan_fsm_wait_ts_ready_onenter(struct osmo_fsm_inst *fi, uint32_t p lchan->bs_power_db = bts->bs_power_ctrl.bs_power_val_db; } - if (gsm48_chan_mode_to_non_vamos(info->ch_mode_rate.chan_mode) == GSM48_CMODE_SPEECH_AMR) { - if (lchan_mr_config(&lchan->activate.mr_conf_filtered, lchan, info->ch_mode_rate.s15_s0) < 0) { + lchan->activate.ch_mode_rate = lchan->activate.info.ch_mode_rate; + /* future: automatically adjust chan_mode in lchan->activate.ch_mode_rate */ + + if (gsm48_chan_mode_to_non_vamos(lchan->activate.ch_mode_rate.chan_mode) == GSM48_CMODE_SPEECH_AMR) { + if (lchan_mr_config(&lchan->activate.mr_conf_filtered, lchan, lchan->activate.ch_mode_rate.s15_s0) < 0) { lchan_fail("Can not generate multirate configuration IE\n"); return; } @@ -656,7 +659,7 @@ static void lchan_fsm_wait_ts_ready_onenter(struct osmo_fsm_inst *fi, uint32_t p (use_mgwep_ci ? osmo_mgcpc_ep_ci_name(use_mgwep_ci) : "new") : "none", gsm_lchant_name(lchan->type), - gsm48_chan_mode_name(lchan->activate.info.ch_mode_rate.chan_mode), + gsm48_chan_mode_name(lchan->activate.ch_mode_rate.chan_mode), (lchan->activate.info.encr.alg_id ? : 1)-1, lchan->activate.info.encr.key_len ? osmo_hexdump_nospc(lchan->activate.info.encr.key, lchan->activate.info.encr.key_len) : "none"); @@ -806,7 +809,7 @@ static void lchan_fsm_post_activ_ack(struct osmo_fsm_inst *fi) int rc; struct gsm_lchan *lchan = lchan_fi_lchan(fi); - lchan->current_ch_mode_rate = lchan->activate.info.ch_mode_rate; + lchan->current_ch_mode_rate = lchan->activate.ch_mode_rate; lchan->current_mr_conf = lchan->activate.mr_conf_filtered; lchan->tsc_set = lchan->activate.tsc_set; lchan->tsc = lchan->activate.tsc; @@ -999,6 +1002,9 @@ static void lchan_fsm_wait_rsl_chan_mode_modify_ack(struct osmo_fsm_inst *fi, ui .tsc_set = -1, .tsc = -1, }; + lchan->activate.ch_mode_rate = lchan->activate.info.ch_mode_rate; + /* future: automatically adjust chan_mode in lchan->activate.ch_mode_rate */ + lchan->activate.concluded = false; lchan_fsm_state_chg(LCHAN_ST_WAIT_RLL_RTP_ESTABLISH); } else { diff --git a/src/osmo-bsc/lchan_rtp_fsm.c b/src/osmo-bsc/lchan_rtp_fsm.c index 7945359df..3ba418920 100644 --- a/src/osmo-bsc/lchan_rtp_fsm.c +++ b/src/osmo-bsc/lchan_rtp_fsm.c @@ -268,19 +268,19 @@ static void lchan_rtp_fsm_wait_ipacc_crcx_ack_onenter(struct osmo_fsm_inst *fi, return; } - val = ipacc_speech_mode(lchan->activate.info.ch_mode_rate.chan_mode, lchan->type); + val = ipacc_speech_mode(lchan->activate.ch_mode_rate.chan_mode, lchan->type); if (val < 0) { lchan_rtp_fail("Cannot determine Abis/IP speech mode for tch_mode=%s type=%s\n", - get_value_string(gsm48_chan_mode_names, lchan->activate.info.ch_mode_rate.chan_mode), + get_value_string(gsm48_chan_mode_names, lchan->activate.ch_mode_rate.chan_mode), gsm_lchant_name(lchan->type)); return; } lchan->abis_ip.speech_mode = val; - val = ipacc_payload_type(lchan->activate.info.ch_mode_rate.chan_mode, lchan->type); + val = ipacc_payload_type(lchan->activate.ch_mode_rate.chan_mode, lchan->type); if (val < 0) { lchan_rtp_fail("Cannot determine Abis/IP payload type for tch_mode=%s type=%s\n", - get_value_string(gsm48_chan_mode_names, lchan->activate.info.ch_mode_rate.chan_mode), + get_value_string(gsm48_chan_mode_names, lchan->activate.ch_mode_rate.chan_mode), gsm_lchant_name(lchan->type)); return; } @@ -834,14 +834,14 @@ static int chan_mode_to_mgcp_bss_pt(enum mgcp_codecs codec) void mgcp_pick_codec(struct mgcp_conn_peer *verb_info, const struct gsm_lchan *lchan, bool bss_side) { - enum mgcp_codecs codec = chan_mode_to_mgcp_codec(lchan->activate.info.ch_mode_rate.chan_mode, + enum mgcp_codecs codec = chan_mode_to_mgcp_codec(lchan->activate.ch_mode_rate.chan_mode, lchan->type == GSM_LCHAN_TCH_H? false : true); int custom_pt; if (codec < 0) { LOG_LCHAN(lchan, LOGL_ERROR, "Unable to determine MGCP codec type for %s in chan-mode %s\n", - gsm_lchant_name(lchan->type), gsm48_chan_mode_name(lchan->activate.info.ch_mode_rate.chan_mode)); + gsm_lchant_name(lchan->type), gsm48_chan_mode_name(lchan->activate.ch_mode_rate.chan_mode)); verb_info->codecs_len = 0; return; } |