cca interface
This commit is contained in:
parent
2f9340b937
commit
95b55c3a4a
@ -22,6 +22,7 @@ add_library(solanaceae_ngcft1
|
||||
./solanaceae/ngc_ft1/ngcft1.hpp
|
||||
./solanaceae/ngc_ft1/ngcft1.cpp
|
||||
|
||||
./solanaceae/ngc_ft1/cca.hpp
|
||||
./solanaceae/ngc_ft1/ledbat.hpp
|
||||
./solanaceae/ngc_ft1/ledbat.cpp
|
||||
|
||||
|
56
solanaceae/ngc_ft1/cca.hpp
Normal file
56
solanaceae/ngc_ft1/cca.hpp
Normal file
@ -0,0 +1,56 @@
|
||||
#pragma once
|
||||
|
||||
#include <vector>
|
||||
#include <cstdint>
|
||||
|
||||
struct CCAI {
|
||||
public: // config
|
||||
using SeqIDType = std::pair<uint8_t, uint16_t>; // tf_id, seq_id
|
||||
|
||||
static constexpr size_t IPV4_HEADER_SIZE {20};
|
||||
static constexpr size_t IPV6_HEADER_SIZE {40}; // bru
|
||||
static constexpr size_t UDP_HEADER_SIZE {8};
|
||||
|
||||
// TODO: tcp AND IPv6 will be different
|
||||
static constexpr size_t SEGMENT_OVERHEAD {
|
||||
4+ // ft overhead
|
||||
46+ // tox?
|
||||
UDP_HEADER_SIZE+
|
||||
IPV4_HEADER_SIZE
|
||||
};
|
||||
|
||||
// TODO: make configurable, set with tox ngc lossy packet size
|
||||
//const size_t MAXIMUM_SEGMENT_DATA_SIZE {1000-4};
|
||||
const size_t MAXIMUM_SEGMENT_DATA_SIZE {500-4};
|
||||
|
||||
const size_t MAXIMUM_SEGMENT_SIZE {MAXIMUM_SEGMENT_DATA_SIZE + SEGMENT_OVERHEAD}; // tox 500 - 4 from ft
|
||||
//static_assert(maximum_segment_size == 574); // mesured in wireshark
|
||||
|
||||
// flow control
|
||||
float max_byterate_allowed {10*1024*1024}; // 10MiB/s
|
||||
|
||||
public: // api
|
||||
CCAI(size_t maximum_segment_data_size) : MAXIMUM_SEGMENT_DATA_SIZE(maximum_segment_data_size) {}
|
||||
|
||||
// return the current believed window in bytes of how much data can be inflight,
|
||||
virtual float getCWnD(void) const = 0;
|
||||
|
||||
// TODO: api for how much data we should send
|
||||
// take time since last sent into account
|
||||
// respect max_byterate_allowed
|
||||
virtual size_t canSend(void) const = 0;
|
||||
|
||||
// get the list of timed out seq_ids
|
||||
virtual std::vector<SeqIDType> getTimeouts(void) const = 0;
|
||||
|
||||
public: // callbacks
|
||||
// data size is without overhead
|
||||
virtual void onSent(SeqIDType seq, size_t data_size) = 0;
|
||||
|
||||
// TODO: copy???
|
||||
virtual void onAck(std::vector<SeqIDType> seqs) = 0;
|
||||
|
||||
// if discard, not resent, not inflight
|
||||
virtual void onLoss(SeqIDType seq, bool discard) = 0;
|
||||
};
|
||||
|
@ -15,7 +15,7 @@
|
||||
|
||||
inline constexpr bool PLOTTING = false;
|
||||
|
||||
LEDBAT::LEDBAT(size_t maximum_segment_data_size) : MAXIMUM_SEGMENT_DATA_SIZE(maximum_segment_data_size) {
|
||||
LEDBAT::LEDBAT(size_t maximum_segment_data_size) : CCAI(maximum_segment_data_size) {
|
||||
_time_start_offset = clock::now();
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "./cca.hpp"
|
||||
|
||||
#include <chrono>
|
||||
#include <deque>
|
||||
#include <vector>
|
||||
@ -9,8 +11,9 @@
|
||||
// LEDBAT++: https://www.ietf.org/archive/id/draft-irtf-iccrg-ledbat-plus-plus-01.txt
|
||||
|
||||
// LEDBAT++ implementation
|
||||
struct LEDBAT {
|
||||
struct LEDBAT : public CCAI{
|
||||
public: // config
|
||||
#if 0
|
||||
using SeqIDType = std::pair<uint8_t, uint16_t>; // tf_id, seq_id
|
||||
|
||||
static constexpr size_t IPV4_HEADER_SIZE {20};
|
||||
@ -32,6 +35,7 @@ struct LEDBAT {
|
||||
//static constexpr size_t maximum_segment_size {496 + segment_overhead}; // tox 500 - 4 from ft
|
||||
const size_t MAXIMUM_SEGMENT_SIZE {MAXIMUM_SEGMENT_DATA_SIZE + SEGMENT_OVERHEAD}; // tox 500 - 4 from ft
|
||||
//static_assert(maximum_segment_size == 574); // mesured in wireshark
|
||||
#endif
|
||||
|
||||
// ledbat++ says 60ms, we might need other values if relayed
|
||||
//const float target_delay {0.060f};
|
||||
@ -50,26 +54,26 @@ struct LEDBAT {
|
||||
|
||||
// return the current believed window in bytes of how much data can be inflight,
|
||||
// without overstepping the delay requirement
|
||||
float getCWnD(void) const {
|
||||
float getCWnD(void) const override {
|
||||
return _cwnd;
|
||||
}
|
||||
|
||||
// TODO: api for how much data we should send
|
||||
// take time since last sent into account
|
||||
// respect max_byterate_allowed
|
||||
size_t canSend(void) const;
|
||||
size_t canSend(void) const override;
|
||||
|
||||
// get the list of timed out seq_ids
|
||||
std::vector<SeqIDType> getTimeouts(void) const;
|
||||
std::vector<SeqIDType> getTimeouts(void) const override;
|
||||
|
||||
public: // callbacks
|
||||
// data size is without overhead
|
||||
void onSent(SeqIDType seq, size_t data_size);
|
||||
void onSent(SeqIDType seq, size_t data_size) override;
|
||||
|
||||
void onAck(std::vector<SeqIDType> seqs);
|
||||
void onAck(std::vector<SeqIDType> seqs) override;
|
||||
|
||||
// if discard, not resent, not inflight
|
||||
void onLoss(SeqIDType seq, bool discard);
|
||||
void onLoss(SeqIDType seq, bool discard) override;
|
||||
|
||||
private:
|
||||
using clock = std::chrono::steady_clock;
|
||||
|
@ -139,7 +139,7 @@ class NGCFT1 : public ToxEventI, public NGCEXTEventI, public NGCFT1EventProvider
|
||||
|
||||
struct Group {
|
||||
struct Peer {
|
||||
std::unique_ptr<LEDBAT> cca = std::make_unique<LEDBAT>(500-4); // TODO: replace with tox_group_max_custom_lossy_packet_length()-4
|
||||
std::unique_ptr<CCAI> cca = std::make_unique<LEDBAT>(500-4); // TODO: replace with tox_group_max_custom_lossy_packet_length()-4
|
||||
|
||||
struct RecvTransfer {
|
||||
uint32_t file_kind;
|
||||
|
Loading…
Reference in New Issue
Block a user