gprs: Fix LLC UI window
According to TS 44.064 section 8.4.2, the LLC layer should only drop UI frames if V(UR)-32 <= N(U) < V(UR). The code was dropping frames whenever N(U) < V(UR). Consequently, large amounts of packets could be dropped if, e.g., V(UR)==511 and the frame with N(U)==511 was lost. All frames would be dropped until the next time a frame with N(U)==511 is received.
This commit is contained in:
parent
7ad066c5c3
commit
5f7d3cd6d2
|
@ -482,17 +482,21 @@ static int gprs_llc_hdr_rx(struct gprs_llc_hdr_parsed *gph,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GPRS_LLC_UI:
|
case GPRS_LLC_UI:
|
||||||
if (gph->seq_tx < lle->vu_recv) {
|
{
|
||||||
LOGP(DLLC, LOGL_NOTICE, "TLLI=%08x dropping UI, vurecv %u <= %u\n",
|
int delta = (lle->vu_recv - gph->seq_tx) & 0x1ff;
|
||||||
lle->llme ? lle->llme->tlli : -1,
|
if (0 < delta && delta < 32) {
|
||||||
gph->seq_tx, lle->vu_recv);
|
LOGP(DLLC, LOGL_NOTICE, "TLLI=%08x dropping UI, vurecv %u <= %u\n",
|
||||||
return -EIO;
|
lle->llme ? lle->llme->tlli : -1,
|
||||||
}
|
gph->seq_tx, lle->vu_recv);
|
||||||
/* Increment the sequence number that we expect in the next frame */
|
return -EIO;
|
||||||
lle->vu_recv = (gph->seq_tx + 1) % 512;
|
}
|
||||||
/* Increment Overflow Counter */
|
/* Increment the sequence number that we expect in the next frame */
|
||||||
if ((gph->seq_tx + 1) / 512)
|
lle->vu_recv = (gph->seq_tx + 1) & 0x1ff;
|
||||||
lle->oc_ui_recv += 512;
|
/* Increment Overflow Counter */
|
||||||
|
if (lle->vu_recv == 0) {
|
||||||
|
lle->oc_ui_recv += 512;
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue