mirror of
https://gitea.osmocom.org/cellular-infrastructure/osmo-bts.git
synced 2025-11-03 05:33:26 +00:00
rsl: rsl_handle_chan_mod_ie(): set lchan->csd_mode for NT CSD
In commit66eae187, I skipped assigning LCHAN_CSD_M_NT (0) to lchan->csd_mode for non-transparent channel modes. I assumed that the entire gsm_lchan struct was zero-initialized during activation or release procedures, but this assumption was incorrect. In fact, some lchan fields are initialized during activation, while others are initialized during release. Specifically, lchan->csd_mode is zero-initialized when the process starts, and then updated only for transparent mode requests. For non-transparent mode requests, this field is not updated, meaning it retains its previous value. This bug caused incorrect E1/E2/E3 bit settings and missing GSMTAP RLP output for channels that were previously used for transparent CSD calls. This patch is fixing it. Change-Id: I793ab4dc25fa852eade6f7a3b67ae961ceb7a093 Fixes:66eae187"rsl: rsl_handle_chan_mod_ie(): set lchan->csd_mode" Related: OS#1572, OS#6579
This commit is contained in:
@@ -205,37 +205,48 @@ static int rsl_handle_chan_mod_ie(struct gsm_lchan *lchan,
|
||||
/* If octet 4 indicates non-transparent data */
|
||||
case RSL_CMODE(RSL_CMOD_SPD_DATA, RSL_CMOD_CSD_NT_14k5):
|
||||
lchan->tch_mode = GSM48_CMODE_DATA_14k5;
|
||||
lchan->csd_mode = LCHAN_CSD_M_NT;
|
||||
break;
|
||||
case RSL_CMODE(RSL_CMOD_SPD_DATA, RSL_CMOD_CSD_NT_12k0):
|
||||
lchan->tch_mode = GSM48_CMODE_DATA_12k0;
|
||||
lchan->csd_mode = LCHAN_CSD_M_NT;
|
||||
break;
|
||||
case RSL_CMODE(RSL_CMOD_SPD_DATA, RSL_CMOD_CSD_NT_6k0):
|
||||
lchan->tch_mode = GSM48_CMODE_DATA_6k0;
|
||||
lchan->csd_mode = LCHAN_CSD_M_NT;
|
||||
break;
|
||||
case RSL_CMODE(RSL_CMOD_SPD_DATA, RSL_CMOD_CSD_NT_43k5):
|
||||
lchan->tch_mode = GSM48_CMODE_DATA_43k5;
|
||||
lchan->csd_mode = LCHAN_CSD_M_NT;
|
||||
break;
|
||||
case RSL_CMODE(RSL_CMOD_SPD_DATA, RSL_CMOD_CSD_NT_28k8):
|
||||
/* 28.8 kbit/s services, 29.0 kbit/s radio interface rate */
|
||||
lchan->tch_mode = GSM48_CMODE_DATA_29k0;
|
||||
lchan->csd_mode = LCHAN_CSD_M_NT;
|
||||
break;
|
||||
case RSL_CMODE(RSL_CMOD_SPD_DATA, RSL_CMOD_CSD_NTA_43k5_14k5):
|
||||
lchan->tch_mode = GSM48_CMODE_DATA_43k5_14k5;
|
||||
lchan->csd_mode = LCHAN_CSD_M_NT;
|
||||
break;
|
||||
case RSL_CMODE(RSL_CMOD_SPD_DATA, RSL_CMOD_CSD_NTA_29k0_14k5):
|
||||
lchan->tch_mode = GSM48_CMODE_DATA_29k0_14k5;
|
||||
lchan->csd_mode = LCHAN_CSD_M_NT;
|
||||
break;
|
||||
case RSL_CMODE(RSL_CMOD_SPD_DATA, RSL_CMOD_CSD_NTA_43k5_29k0):
|
||||
lchan->tch_mode = GSM48_CMODE_DATA_43k5_29k0;
|
||||
lchan->csd_mode = LCHAN_CSD_M_NT;
|
||||
break;
|
||||
case RSL_CMODE(RSL_CMOD_SPD_DATA, RSL_CMOD_CSD_NTA_14k5_43k5):
|
||||
lchan->tch_mode = GSM48_CMODE_DATA_14k5_43k5;
|
||||
lchan->csd_mode = LCHAN_CSD_M_NT;
|
||||
break;
|
||||
case RSL_CMODE(RSL_CMOD_SPD_DATA, RSL_CMOD_CSD_NTA_14k5_29k0):
|
||||
lchan->tch_mode = GSM48_CMODE_DATA_14k5_29k0;
|
||||
lchan->csd_mode = LCHAN_CSD_M_NT;
|
||||
break;
|
||||
case RSL_CMODE(RSL_CMOD_SPD_DATA, RSL_CMOD_CSD_NTA_29k0_43k5):
|
||||
lchan->tch_mode = GSM48_CMODE_DATA_29k0_43k5;
|
||||
lchan->csd_mode = LCHAN_CSD_M_NT;
|
||||
break;
|
||||
|
||||
/* If octet 4 indicates transparent data */
|
||||
|
||||
Reference in New Issue
Block a user