roo_transport
API Documentation for roo_transport
Loading...
Searching...
No Matches
out_buffer.cpp
Go to the documentation of this file.
2
3#include <cmath>
4
5#include "roo_io/memory/load.h"
6#include "roo_io/memory/store.h"
8
9#if (defined ESP32 || defined ROO_TESTING)
10#include "esp_random.h"
11#define RANDOM_INTEGER esp_random
12#else
13#define RANDOM_INTEGER rand
14#endif
15
16namespace roo_transport {
17namespace internal {
18
19void OutBuffer::init(SeqNum seq_id, bool control_bit) {
20 uint16_t header = FormatPacketHeader(seq_id, kDataPacket, control_bit);
21 roo_io::StoreBeU16(header, payload_);
22 size_ = 0;
23 acked_ = false;
24 flushed_ = false;
25 finished_ = false;
26 expiration_ = roo_time::Uptime::Start();
27 send_counter_ = 0;
28}
29
30namespace {
31
32roo_time::Duration Backoff(int retry_count) {
33 float min_delay_us = 5000.0f; // 5ms
34 float max_delay_us = 200000.0f; // 200ms
35 float delay = pow(1.33, retry_count) * min_delay_us;
36 if (delay > max_delay_us) {
37 delay = max_delay_us;
38 }
39 // Randomize by +=20%, to make unrelated retries spread more evenly in time.
40 delay += (float)delay * ((float)RANDOM_INTEGER() / RAND_MAX - 0.5f) * 0.4f;
41 return roo_time::Micros((uint64_t)delay);
42}
43
44} // namespace
45
46void OutBuffer::markSent(roo_time::Uptime now) {
47 if (send_counter_ < 255) ++send_counter_;
48 expiration_ = now + Backoff(send_counter_);
49}
50
52 uint16_t raw = roo_io::LoadBeU16(payload_);
54 roo_io::StoreBeU16(raw, payload_);
55}
56
57} // namespace internal
58} // namespace roo_transport
void init(SeqNum seq_id, bool control_bit)
void markSent(roo_time::Uptime now)
void SetPacketHeaderTypeFin(uint16_t &header)
Definition protocol.h:126
uint16_t FormatPacketHeader(SeqNum seq, PacketType type, bool control_bit)
Definition protocol.h:121
#define RANDOM_INTEGER