From ea369095db762931e57f0a4cd3472647791ca831 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Wed, 21 Oct 2020 13:05:44 +0200 Subject: lapdm: Allow SABM L=0 in Timer Recovery State 3GPP TS 44.006 8.6.3 "Procedures for re-establishment" is quite explicit: """ When the data link layer receives in the multiple frame established state or !!!timer recovery state!!! a DL-ESTABLISH- REQUEST primitive from layer 3 or an SABM (with L=0), the normal establishment procedure of sub-clause 8.4.1.2 shall be initiated. """ If L>0 in that state, send a DM as stated in 8.4.1.2: """ If the data link layer entity is unable to enter the multiple-frame-established state, it shall respond to the SABM command with a DM response with the F bit set to the same binary value as the P bit in the received SABM command. """ Related: OS#4549 Related: OS#4819 Change-Id: I7959dc39f883cd5c56c36a21176a2401838d7b62 --- src/gsm/lapd_core.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/gsm/lapd_core.c b/src/gsm/lapd_core.c index bcb64b0e..ed0b3209 100644 --- a/src/gsm/lapd_core.c +++ b/src/gsm/lapd_core.c @@ -849,6 +849,23 @@ static int lapd_rx_u_sabm(struct msgb *msg, struct lapd_msg_ctx *lctx) switch (dl->state) { case LAPD_STATE_IDLE: break; + case LAPD_STATE_TIMER_RECOV: + LOGDL(dl, LOGL_INFO, "SABM command, timer recovery state\n"); + /* If link is lost on the remote side, we start over + * and send DL-ESTABLISH indication again. */ + /* 3GPP TS 44.006 8.6.3 "Procedures for re-establishment" */ + if (length) { + /* check for contention resoultion */ + LOGDL(dl, LOGL_ERROR, "SABM L>0 not expected in timer " + "recovery state\n"); + mdl_error(MDL_CAUSE_SABM_INFO_NOTALL, lctx); + lapd_send_dm(lctx); + msgb_free(msg); + return 0; + } + /* re-establishment, continue below */ + lapd_stop_t200(dl); + break; case LAPD_STATE_MF_EST: LOGDL(dl, LOGL_INFO, "SABM command, multiple frame established state\n"); /* If link is lost on the remote side, we start over -- cgit v1.2.3