diff --git a/lib/ngtcp2_acktr.c b/lib/ngtcp2_acktr.c index cb7b926fe33d23df49df510d23c2a1f80c673cc1..12331e22afb4d1f65a07aa61fdd7d66336da8c8f 100644 --- a/lib/ngtcp2_acktr.c +++ b/lib/ngtcp2_acktr.c @@ -168,9 +168,14 @@ static void acktr_remove(ngtcp2_acktr *acktr, ngtcp2_acktr_entry **pent) { *pent = (*pent)->next; if (*pent) { (*pent)->pprev = pent; + } else { + acktr->tail = + ngtcp2_struct_of((ngtcp2_acktr_entry *)pent, ngtcp2_acktr_entry, next); } ngtcp2_acktr_entry_del(ent, acktr->mem); + + --acktr->nack; } static void acktr_on_ack(ngtcp2_acktr *acktr, size_t ack_ent_offset) { @@ -191,7 +196,7 @@ static void acktr_on_ack(ngtcp2_acktr *acktr, size_t ack_ent_offset) { } } if (*pent == NULL) { - return; + goto fin; } min_ack = largest_ack - fr->first_ack_blklen; @@ -229,6 +234,9 @@ static void acktr_on_ack(ngtcp2_acktr *acktr, size_t ack_ent_offset) { largest_ack = min_ack; ++i; } + +fin: + ngtcp2_ringbuf_resize(&acktr->acks, ack_ent_offset); } void ngtcp2_acktr_recv_ack(ngtcp2_acktr *acktr, const ngtcp2_ack *fr, diff --git a/tests/main.c b/tests/main.c index 271e6fb64d2893f7b0cf2f68d6b7978b1df579f3..f0c04bcdee92b125f03f6510a017d0ed654cf945 100644 --- a/tests/main.c +++ b/tests/main.c @@ -116,6 +116,7 @@ int main() { !CU_add_test(pSuite, "acktr_add", test_ngtcp2_acktr_add) || !CU_add_test(pSuite, "acktr_eviction", test_ngtcp2_acktr_eviction) || !CU_add_test(pSuite, "acktr_forget", test_ngtcp2_acktr_forget) || + !CU_add_test(pSuite, "acktr_recv_ack", test_ngtcp2_acktr_recv_ack) || !CU_add_test(pSuite, "encode_transport_params", test_ngtcp2_encode_transport_params) || !CU_add_test(pSuite, "rtb_add", test_ngtcp2_rtb_add) || diff --git a/tests/ngtcp2_acktr_test.c b/tests/ngtcp2_acktr_test.c index 46982aa00fa0f40a207e7aab6af57771061edc26..7d82482f5c9cdb216faad3e155aa006e0f7f5c3e 100644 --- a/tests/ngtcp2_acktr_test.c +++ b/tests/ngtcp2_acktr_test.c @@ -179,7 +179,7 @@ void test_ngtcp2_acktr_recv_ack(void) { uint64_t pkt_nums[] = { 4500, 4499, 4497, 4496, 4494, 4493, 4491, 4490, 4488, 4487, }; - ngtcp2_acktr_entry *ent; + ngtcp2_acktr_entry *ent, *next; ngtcp2_acktr_init(&acktr, mem); @@ -192,14 +192,16 @@ void test_ngtcp2_acktr_recv_ack(void) { fr.largest_ack = 4500; fr.ack_delay = 0; fr.first_ack_blklen = 1; - fr.num_blks = 2; - fr.blks[0].gap = 5; + fr.num_blks = 3; + fr.blks[0].gap = 4; fr.blks[0].blklen = 2; fr.blks[1].gap = 1; fr.blks[1].blklen = 1; + fr.blks[2].gap = 3; + fr.blks[2].blklen = 1; - ngtcp2_acktr_add_ack(&acktr, 999, &fr, 0); ngtcp2_acktr_add_ack(&acktr, 998, &fr, 0); + ngtcp2_acktr_add_ack(&acktr, 999, &fr, 0); fr.type = NGTCP2_FRAME_ACK; fr.largest_ack = 999; @@ -210,7 +212,7 @@ void test_ngtcp2_acktr_recv_ack(void) { ngtcp2_acktr_recv_ack(&acktr, &fr, 0); CU_ASSERT(0 == ngtcp2_ringbuf_len(&acktr.acks)); - CU_ASSERT(5 == acktr.nack); + CU_ASSERT(4 == acktr.nack); ent = acktr.ent; @@ -221,8 +223,13 @@ void test_ngtcp2_acktr_recv_ack(void) { CU_ASSERT(4490 == ent->pkt_num); ent = ent->next; CU_ASSERT(4488 == ent->pkt_num); - ent = ent->next; - CU_ASSERT(4487 == ent->pkt_num); + CU_ASSERT(ent == acktr.tail); ngtcp2_acktr_free(&acktr); + + for (ent = acktr.ent; ent;) { + next = ent->next; + ngtcp2_acktr_entry_del(ent, mem); + ent = next; + } }