diff --git a/pcu/GPRS_Components.ttcn b/pcu/GPRS_Components.ttcn index 234d9102c..7093f3146 100644 --- a/pcu/GPRS_Components.ttcn +++ b/pcu/GPRS_Components.ttcn @@ -625,12 +625,18 @@ function f_acknackdesc_ack_block(inout AckNackDescription desc, RlcmacDlBlock dl bsn := dl_block.data_egprs.mac_hdr.bsn1; } - inc := bsn - desc.starting_seq_nr + 1; /* Filling hole? */ if (bsn < desc.starting_seq_nr) { desc.receive_block_bitmap[lengthof(desc.receive_block_bitmap) - (desc.starting_seq_nr - bsn)] := int2bit(1, 1); return; } + /* Filling hole, wraparound: */ + if (bsn - desc.starting_seq_nr > lengthof(desc.receive_block_bitmap)) { + desc.receive_block_bitmap[lengthof(desc.receive_block_bitmap) - (desc.starting_seq_nr + (218 - bsn))] := int2bit(1, 1); + return; + } + + inc := bsn - desc.starting_seq_nr + 1; /* SSN is increased, and so RBB values need to be moved */ for (i := 0; i < lengthof(desc.receive_block_bitmap) - inc; i := i+1) { @@ -640,7 +646,7 @@ function f_acknackdesc_ack_block(inout AckNackDescription desc, RlcmacDlBlock dl desc.receive_block_bitmap[i] := int2bit(0, 1); } /* Now we can set current bit and update SSN */ - desc.starting_seq_nr := bsn + 1; + desc.starting_seq_nr := (bsn + 1) mod 128; desc.receive_block_bitmap[lengthof(desc.receive_block_bitmap) - 1] := int2bit(1, 1); /* Finally update the final_ack bit as requested: */