diff options
-rw-r--r-- | openbsc/include/openbsc/abis_rsl.h | 2 | ||||
-rw-r--r-- | openbsc/src/libbsc/abis_rsl.c | 22 | ||||
-rw-r--r-- | openbsc/src/libbsc/chan_alloc.c | 2 |
3 files changed, 26 insertions, 0 deletions
diff --git a/openbsc/include/openbsc/abis_rsl.h b/openbsc/include/openbsc/abis_rsl.h index 4f2b6b551..06f0a721c 100644 --- a/openbsc/include/openbsc/abis_rsl.h +++ b/openbsc/include/openbsc/abis_rsl.h @@ -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 */ diff --git a/openbsc/src/libbsc/abis_rsl.c b/openbsc/src/libbsc/abis_rsl.c index 6e1ce7852..42dad7fde 100644 --- a/openbsc/src/libbsc/abis_rsl.c +++ b/openbsc/src/libbsc/abis_rsl.c @@ -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); +} diff --git a/openbsc/src/libbsc/chan_alloc.c b/openbsc/src/libbsc/chan_alloc.c index 9b59d5df0..411a6cbef 100644 --- a/openbsc/src/libbsc/chan_alloc.c +++ b/openbsc/src/libbsc/chan_alloc.c @@ -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); } |