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:
Holger Hans Peter Freyther 2012-12-25 23:45:14 +01:00
parent 48ea4e8aec
commit 006e3d87e0
3 changed files with 26 additions and 0 deletions

View File

@ -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 */

View File

@ -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);
}

View File

@ -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);
}