18 #include <protocols/errors.h>
19 #include <protocols/fec_utils.h>
20 #include <protocols/indexer.h>
21 #include <protocols/rtc/rtc_consts.h>
22 #include <protocols/transport_protocol.h>
36 template <u
int32_t LIMIT = MIN_PROBE_SEQ>
43 next_suffix_(first_suffix_),
44 fec_type_(fec::FECType::UNKNOWN),
46 n_current_fec_(n_fec_) {}
53 next_suffix_ = first_suffix_;
59 uint32_t getNextSuffix()
override {
60 if (isFec(next_suffix_)) {
62 auto ret = next_suffix_++;
66 n_current_fec_ = n_fec_;
67 next_suffix_ = nextSource(next_suffix_);
69 }
else if (!n_current_fec_) {
70 n_current_fec_ = n_fec_;
73 return (next_suffix_++ % LIMIT);
77 first_suffix_ = suffix % LIMIT;
80 uint32_t getFirstSuffix()
override {
return first_suffix_; }
83 next_suffix_ = index % LIMIT;
89 bool reassembly)
override {
91 auto ret = verifier_->verifyPackets(&content_object);
94 case auth::VerificationPolicy::ACCEPT: {
101 case auth::VerificationPolicy::UNKNOWN:
102 case auth::VerificationPolicy::DROP: {
103 transport_->onPacketDropped(
104 interest, content_object,
105 make_error_code(protocol_error::verification_failed));
109 case auth::VerificationPolicy::ABORT: {
110 transport_->onContentReassembled(
111 make_error_code(protocol_error::session_aborted));
122 "Get reassembly segment called on rtc indexer. RTC indexer does not "
129 uint32_t getFinalSuffix()
override {
return LIMIT; }
131 void enableFec(fec::FECType fec_type)
override { fec_type_ = fec_type; }
133 void disableFec()
override { fec_type_ = fec::FECType::UNKNOWN; }
137 n_current_fec_ = n_fec_;
140 uint32_t getNFec()
override {
return n_fec_; }
142 bool isFec(uint32_t index)
override {
143 return isFec(fec_type_, index, first_suffix_);
146 double getFecOverhead()
override {
147 if (fec_type_ == fec::FECType::UNKNOWN) {
151 double k = (double)fec::FECUtils::getSourceSymbols(fec_type_);
152 return (
double)n_fec_ / k;
155 double getMaxFecOverhead()
override {
156 if (fec_type_ == fec::FECType::UNKNOWN) {
160 double k = (double)fec::FECUtils::getSourceSymbols(fec_type_);
161 double n = (double)fec::FECUtils::getBlockSymbols(fec_type_);
162 return (
double)(n - k) / k;
165 static bool isFec(fec::FECType fec_type, uint32_t index,
166 uint32_t first_suffix) {
168 return fec::FECUtils::isFec(fec_type, index, first_suffix);
174 static uint32_t nextSource(fec::FECType fec_type, uint32_t index,
175 uint32_t first_suffix) {
176 return fec::FECUtils::nextSource(fec_type, index, first_suffix) % LIMIT;
180 uint32_t nextSource(uint32_t index) {
181 return nextSource(fec_type_, index, first_suffix_);
185 uint32_t first_suffix_;
186 uint32_t next_suffix_;
187 fec::FECType fec_type_;
190 uint32_t n_current_fec_;