diff options
author | Pau Espin Pedrol <pespin@sysmocom.de> | 2020-10-21 13:05:44 +0200 |
---|---|---|
committer | pespin <pespin@sysmocom.de> | 2020-10-21 13:03:30 +0000 |
commit | 76190d308d849768d9b87b74c9371af4c6f1c19c (patch) | |
tree | 5e7a8d37783478c5c428d094aacd4f264e826a5a /src | |
parent | d5f71474195775091fe40a63275cad6fb5b539ea (diff) |
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
Diffstat (limited to 'src')
-rw-r--r-- | src/gsm/lapd_core.c | 17 |
1 files changed, 17 insertions, 0 deletions
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 |