diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2017-07-21 23:43:48 -0400 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2017-07-21 23:43:48 -0400 |
commit | 4655a6bfef4b87b3674cafcbe8e8d2debadf3cbf (patch) | |
tree | 8ebba3c437a30f7301967f49fd1e5b620bacd1e2 /klippy/serialqueue.c | |
parent | 61325c0a14a97b2a013d5c38ef81035e0af10e2f (diff) | |
download | kutter-4655a6bfef4b87b3674cafcbe8e8d2debadf3cbf.tar.gz kutter-4655a6bfef4b87b3674cafcbe8e8d2debadf3cbf.tar.xz kutter-4655a6bfef4b87b3674cafcbe8e8d2debadf3cbf.zip |
serialqueue: Fix off-by-one error in retransmit sequence number tracking
Track the sequence number of the message last retransmitted (not the
sequence number of the next message to be transmitted). This fixes a
small possibility of a valid nak not being honored.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'klippy/serialqueue.c')
-rw-r--r-- | klippy/serialqueue.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/klippy/serialqueue.c b/klippy/serialqueue.c index da66c431..5886f8e1 100644 --- a/klippy/serialqueue.c +++ b/klippy/serialqueue.c @@ -448,7 +448,7 @@ update_receive_seq(struct serialqueue *sq, double eventtime, uint64_t rseq) pollreactor_update_timer(&sq->pr, SQPT_COMMAND, PR_NOW); // Update retransmit info - if (sq->rtt_sample_seq && rseq >= sq->rtt_sample_seq + if (sq->rtt_sample_seq && rseq > sq->rtt_sample_seq && sq->last_receive_sent_time) { // RFC6298 rtt calculations double delta = eventtime - sq->last_receive_sent_time; @@ -586,7 +586,7 @@ retransmit_event(struct serialqueue *sq, double eventtime) if (sq->rto > MAX_RTO) sq->rto = MAX_RTO; } - sq->retransmit_seq = sq->send_seq; + sq->retransmit_seq = sq->send_seq - 1; sq->rtt_sample_seq = 0; if (eventtime > sq->idle_time) sq->idle_time = eventtime; @@ -654,9 +654,9 @@ build_and_send_command(struct serialqueue *sq, double eventtime) if (list_empty(&sq->sent_queue)) pollreactor_update_timer(&sq->pr, SQPT_RETRANSMIT , sq->idle_time + sq->rto); - sq->send_seq++; if (!sq->rtt_sample_seq) sq->rtt_sample_seq = sq->send_seq; + sq->send_seq++; list_add_tail(&out->node, &sq->sent_queue); } |