aboutsummaryrefslogtreecommitdiffstats
path: root/src/common/gsm_data_shared.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/gsm_data_shared.c')
-rw-r--r--src/common/gsm_data_shared.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/common/gsm_data_shared.c b/src/common/gsm_data_shared.c
index 553c09bb..328b57e2 100644
--- a/src/common/gsm_data_shared.c
+++ b/src/common/gsm_data_shared.c
@@ -597,9 +597,11 @@ uint8_t gsm_pchan2chan_nr(enum gsm_phys_chan_config pchan,
{
uint8_t cbits, chan_nr;
+ OSMO_ASSERT(pchan != GSM_PCHAN_TCH_F_TCH_H_PDCH);
+ OSMO_ASSERT(pchan != GSM_PCHAN_TCH_F_PDCH);
+
switch (pchan) {
case GSM_PCHAN_TCH_F:
- case GSM_PCHAN_TCH_F_PDCH:
OSMO_ASSERT(lchan_nr == 0);
cbits = 0x01;
break;
@@ -652,11 +654,19 @@ uint8_t gsm_pchan2chan_nr(enum gsm_phys_chan_config pchan,
uint8_t gsm_lchan2chan_nr(const struct gsm_lchan *lchan)
{
- enum gsm_phys_chan_config pchan = lchan->ts->pchan;
- if (pchan == GSM_PCHAN_TCH_F_TCH_H_PDCH)
+ switch (lchan->ts->pchan) {
+ case GSM_PCHAN_TCH_F_TCH_H_PDCH:
+ /* Return chan_nr reflecting the current TS pchan, either a standard TCH kind, or the
+ * nonstandard value reflecting PDCH for Osmocom style dyn TS. */
return gsm_lchan_as_pchan2chan_nr(lchan,
lchan->ts->dyn.pchan_is);
- return gsm_pchan2chan_nr(lchan->ts->pchan, lchan->ts->nr, lchan->nr);
+ case GSM_PCHAN_TCH_F_PDCH:
+ /* For ip.access style dyn TS, we always want to use the chan_nr as if it was TCH/F.
+ * We're using custom PDCH ACT and DEACT messages that use the usual chan_nr values. */
+ return gsm_lchan_as_pchan2chan_nr(lchan, GSM_PCHAN_TCH_F);
+ default:
+ return gsm_pchan2chan_nr(lchan->ts->pchan, lchan->ts->nr, lchan->nr);
+ }
}
uint8_t gsm_lchan_as_pchan2chan_nr(const struct gsm_lchan *lchan,