diff --git a/openbsc/src/libcommon/gsm_data_shared.c b/openbsc/src/libcommon/gsm_data_shared.c index b5e7e029d..8d99ea42d 100644 --- a/openbsc/src/libcommon/gsm_data_shared.c +++ b/openbsc/src/libcommon/gsm_data_shared.c @@ -658,11 +658,17 @@ struct gsm_lchan *rsl_lchan_lookup(struct gsm_bts_trx *trx, uint8_t chan_nr, lch_idx = 0; /* TCH/F */ if (ts->pchan != GSM_PCHAN_TCH_F && ts->pchan != GSM_PCHAN_PDCH && - ts->pchan != GSM_PCHAN_TCH_F_PDCH) + ts->pchan != GSM_PCHAN_TCH_F_PDCH + && !(ts->pchan == GSM_PCHAN_TCH_F_TCH_H_PDCH + && (ts->dyn.pchan_is == GSM_PCHAN_TCH_F + || ts->dyn.pchan_want == GSM_PCHAN_TCH_F))) ok = false; } else if ((cbits & 0x1e) == 0x02) { lch_idx = cbits & 0x1; /* TCH/H */ - if (ts->pchan != GSM_PCHAN_TCH_H) + if (ts->pchan != GSM_PCHAN_TCH_H + && !(ts->pchan == GSM_PCHAN_TCH_F_TCH_H_PDCH + && (ts->dyn.pchan_is == GSM_PCHAN_TCH_H + || ts->dyn.pchan_want == GSM_PCHAN_TCH_H))) ok = false; } else if ((cbits & 0x1c) == 0x04) { lch_idx = cbits & 0x3; /* SDCCH/4 */ @@ -681,6 +687,10 @@ struct gsm_lchan *rsl_lchan_lookup(struct gsm_bts_trx *trx, uint8_t chan_nr, ts->pchan != GSM_PCHAN_CCCH_SDCCH4_CBCH) ok = false; /* FIXME: we should not return first sdcch4 !!! */ + } else if ((chan_nr & RSL_CHAN_NR_MASK) == RSL_CHAN_OSMO_PDCH) { + lch_idx = 0; + if (ts->pchan != GSM_PCHAN_TCH_F_TCH_H_PDCH) + ok = false; } else return NULL;