summaryrefslogtreecommitdiffstats
path: root/src/shared
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2012-01-01 16:42:45 +0100
committerAndreas Eversberg <jolly@eversberg.eu>2012-01-02 02:22:30 +0100
commit506a3443ba52edf988fe2a0a54861738b777756e (patch)
treeb615cc52c2369120f516518aebd56e5d7d94a32f /src/shared
parentc2b823faf07bc5614feadb7aecf49ee84d43d17e (diff)
libosmocore/lapd: Fixed handling of sequence errors at lapd_core.c
If a sequence error is received, the N(R) variable must still be used to acknowledge previously transmitted frames. If there are two subsequent sequence errors received, ignore it. (Ignore every second subsequent error.) This happens if our reply with the REJ is too slow, so the remote gets a T200 timeout and sends another frame with a sequence error. Test showed that replying with two subsequent REJ messages could the remote L2 process to abort. Replying too slow shouldn't happen, but may happen over serial link between BB and LAPD.
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/libosmocore/src/gsm/lapd_core.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/src/shared/libosmocore/src/gsm/lapd_core.c b/src/shared/libosmocore/src/gsm/lapd_core.c
index 54adbcaa..aaaa28a7 100644
--- a/src/shared/libosmocore/src/gsm/lapd_core.c
+++ b/src/shared/libosmocore/src/gsm/lapd_core.c
@@ -1497,14 +1497,32 @@ static int lapd_rx_i(struct msgb *msg, struct lapd_msg_ctx *lctx)
"V(R)=%u\n", ns, dl->v_recv);
/* discard data */
msgb_free(msg);
- if (!dl->seq_err_cond) {
+ if (dl->seq_err_cond != 1) {
/* FIXME: help me understand what exactly todo here
- dl->seq_err_cond = 1;
*/
+ dl->seq_err_cond = 1;
lapd_send_rej(lctx, lctx->p_f);
} else {
+ /* If there are two subsequent sequence errors received,
+ * ignore it. (Ignore every second subsequent error.)
+ * This happens if our reply with the REJ is too slow,
+ * so the remote gets a T200 timeout and sends another
+ * frame with a sequence error.
+ * Test showed that replying with two subsequent REJ
+ * messages could the remote L2 process to abort.
+ * Replying too slow shouldn't happen, but may happen
+ * over serial link between BB and LAPD.
+ */
+ dl->seq_err_cond = 2;
}
- return -EIO;
+ /* Even if N(s) sequence error, acknowledge to N(R)-1 */
+ /* 5.5.3.1: Acknowlege all transmitted frames up the N(R)-1 */
+ lapd_acknowledge(lctx); /* V(A) is also set here */
+
+ /* Send message, if possible due to acknowledged data */
+ lapd_send_i(lctx, __LINE__);
+
+ return 0;
}
dl->seq_err_cond = 0;