On Thu, Dec 05, 2013 at 04:02:38PM +0100, Andreas Eversberg wrote:

> @@ -890,7 +892,18 @@ int rsl_release_request(struct gsm_lchan *lchan, uint8_t 
> link_id,
>       DEBUGP(DRLL, "%s RSL RLL RELEASE REQ (link_id=0x%02x, reason=%u)\n",
>               gsm_lchan_name(lchan), link_id, release_mode);
>  
> -     return abis_rsl_sendmsg(msg);
> +     abis_rsl_sendmsg(msg);
> +
> +     /* Do not wait for Nokia BTS to send the confirm. */
> +     if (is_nokia_bts(lchan->ts->trx->bts)
> +      && release_mode == RSL_REL_LOCAL_END) {
> +             DEBUGP(DRLL, "Do not wait for RELease CONFirm, because Nokia"
> +                     " BTS does not send it.\n");
> +             lchan->sapis[link_id & 0x7] = LCHAN_SAPI_UNUSED;
> +             rsl_handle_release(lchan);


In addition to what I wrote yesterday. This is also violating the
principle of the least surprise and in fact breaks the error handling
release.


Before:
The "effect" rsl_release_request could be observed after the event loop
has been reached (only then we will parse the result from the BTS).

Your patch:
* RLL indication for the release is missing for the NokiaBTS (that is
  an issue and should be resolved by moving the sapi handling code out
  of the RSL_MT_REL_IND case into a method)
* You directly call rsl_handle_release and can get ahead of itself. This
  is a problem for:


        if (deact_sacch == SACCH_DEACTIVATE)
                rsl_deact_sacch(lchan);
        rsl_release_sapis_from(lchan, 0, RSL_REL_LOCAL_END);
                        
        /* TODO: start T3109 now. */
        rsl_lchan_set_state(lchan, LCHAN_S_REL_ERR);

So with your change rsl_handle_release will be called when lchan->state
is not set to LCHAN_S_REL_ERR yet.

holger

Reply via email to