diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h index bdcd0e0dc..b9cb48d3d 100644 --- a/openbsc/include/openbsc/gsm_data.h +++ b/openbsc/include/openbsc/gsm_data.h @@ -296,6 +296,10 @@ struct gsm_network { /* control interface */ struct ctrl_handle *ctrl; + + /* Allow or disallow TCH/F on dynamic TCH/F_TCH/H_PDCH; OS#1778 */ + bool dyn_ts_allow_tch_f; + /* TODO: vty for this; related: OS#1781 */ }; struct osmo_esme; diff --git a/openbsc/src/libbsc/chan_alloc.c b/openbsc/src/libbsc/chan_alloc.c index 1e5dd74cd..c3a7e0f04 100644 --- a/openbsc/src/libbsc/chan_alloc.c +++ b/openbsc/src/libbsc/chan_alloc.c @@ -309,8 +309,9 @@ struct gsm_lchan *lchan_alloc(struct gsm_bts *bts, enum gsm_chan_t type, if (lchan) type = GSM_LCHAN_TCH_F; } + /* Try fully dynamic TCH/F_TCH/H_PDCH as TCH/F... */ - if (!lchan) { + if (!lchan && bts->network->dyn_ts_allow_tch_f) { lchan = _lc_dyn_find_bts(bts, GSM_PCHAN_TCH_F_TCH_H_PDCH, GSM_PCHAN_TCH_F); diff --git a/openbsc/src/libbsc/net_init.c b/openbsc/src/libbsc/net_init.c index ee0d445cd..6d03ee428 100644 --- a/openbsc/src/libbsc/net_init.c +++ b/openbsc/src/libbsc/net_init.c @@ -116,6 +116,8 @@ struct gsm_network *gsm_network_init(uint16_t country_code, uint16_t network_cod net->ext_max = GSM_MAX_EXTEN; gsm_net_update_ctype(net); + net->dyn_ts_allow_tch_f = true; + return net; } diff --git a/openbsc/src/osmo-nitb/bsc_hack.c b/openbsc/src/osmo-nitb/bsc_hack.c index 0b360dcf6..e3e89271e 100644 --- a/openbsc/src/osmo-nitb/bsc_hack.c +++ b/openbsc/src/osmo-nitb/bsc_hack.c @@ -299,6 +299,19 @@ int main(int argc, char **argv) #endif bsc_api_init(bsc_gsmnet, msc_bsc_api()); + /* + * For osmo-nitb, skip TCH/F for now, because otherwise dyn TS + * always imply the possibility to have a mix of TCH/F and + * TCH/H channels; if two phones request a TCH/F and a TCH/H, + * respectively, they cannot call each other. If we deny TCH/F, + * they will both fall back to TCH/H, and dynamic channels are + * usable. See http://osmocom.org/issues/1778. + * + * A third-party MSC may well be able to handle a TCH/H TCH/F + * mismatch. + */ + bsc_gsmnet->dyn_ts_allow_tch_f = false; + /* start control interface after reading config for * ctrl_vty_get_bind_addr() */ LOGP(DNM, LOGL_NOTICE, "CTRL at %s %d\n",