gsm: Do not attempt to release SAPI=0 if it was never allocated
In case of handover (but probably on RACH) we would send a RLL for SAPI=0 even if this SAPI was never established. After we have released all SAPI>0 locally check that SAPI=0 is established and if not release the rf channel directly.
This commit is contained in:
parent
48ea4e8aec
commit
006e3d87e0
|
@ -101,5 +101,7 @@ int rsl_release_sapis_from(struct gsm_lchan *lchan, int start,
|
|||
enum rsl_rel_mode release_mode);
|
||||
int rsl_start_t3109(struct gsm_lchan *lchan);
|
||||
|
||||
int rsl_direct_rf_release(struct gsm_lchan *lchan);
|
||||
|
||||
#endif /* RSL_MT_H */
|
||||
|
||||
|
|
|
@ -2141,3 +2141,25 @@ int rsl_start_t3109(struct gsm_lchan *lchan)
|
|||
osmo_timer_schedule(&lchan->T3109, bts->network->T3109, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief directly RF Channel Release the lchan
|
||||
*
|
||||
* When no SAPI was allocated, directly release the logical channel. This
|
||||
* should only be called from chan_alloc.c on channel release handling. In
|
||||
* case no SAPI was established the RF Channel can be directly released,
|
||||
*/
|
||||
int rsl_direct_rf_release(struct gsm_lchan *lchan)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < ARRAY_SIZE(lchan->sapis); ++i) {
|
||||
if (lchan->sapis[i] != LCHAN_SAPI_UNUSED) {
|
||||
LOGP(DRSL, LOGL_ERROR, "%s SAPI(%d) still allocated.\n",
|
||||
gsm_lchan_name(lchan), i);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Now release it */
|
||||
return rsl_rf_chan_release(lchan, 0, SACCH_NONE);
|
||||
}
|
||||
|
|
|
@ -393,6 +393,8 @@ static void _lchan_handle_release(struct gsm_lchan *lchan,
|
|||
/* Deactivate the SACCH on the BTS side */
|
||||
rsl_deact_sacch(lchan);
|
||||
rsl_start_t3109(lchan);
|
||||
} else if (lchan->sapis[0] == LCHAN_SAPI_UNUSED) {
|
||||
rsl_direct_rf_release(lchan);
|
||||
} else {
|
||||
rsl_release_request(lchan, 0, mode);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue