aboutsummaryrefslogtreecommitdiffstats
path: root/klippy
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2017-07-21 23:43:48 -0400
committerKevin O'Connor <kevin@koconnor.net>2017-07-21 23:43:48 -0400
commit4655a6bfef4b87b3674cafcbe8e8d2debadf3cbf (patch)
tree8ebba3c437a30f7301967f49fd1e5b620bacd1e2 /klippy
parent61325c0a14a97b2a013d5c38ef81035e0af10e2f (diff)
downloadkutter-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')
-rw-r--r--klippy/serialqueue.c6
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);
}