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
This commit is contained in:
Pau Espin 2020-10-21 13:05:44 +02:00 committed by pespin
parent d5f7147419
commit 76190d308d
1 changed files with 17 additions and 0 deletions

View File

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