1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
/*
* Copyright (c) 2017-2019 Cisco and/or its affiliates.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <hicn/transport/utils/chrono_typedefs.h>
#include <protocols/byte_stream_reassembly.h>
#include <protocols/congestion_window_protocol.h>
#include <protocols/protocol.h>
#include <protocols/raaqm_data_path.h>
#include <protocols/rate_estimation.h>
#include <queue>
#include <vector>
namespace transport {
namespace protocol {
class RaaqmTransportProtocol : public TransportProtocol,
public CWindowProtocol {
public:
RaaqmTransportProtocol(implementation::ConsumerSocket *icnet_socket);
~RaaqmTransportProtocol();
int start() override;
void resume() override;
void reset() override;
virtual bool verifyKeyPackets() override;
protected:
static constexpr uint32_t buffer_size =
1 << interface::default_values::log_2_default_buffer_size;
static constexpr uint16_t mask = buffer_size - 1;
using PathTable =
std::unordered_map<uint32_t, std::unique_ptr<RaaqmDataPath>>;
void increaseWindow() override;
void decreaseWindow() override;
virtual void afterContentReception(const Interest &interest,
const ContentObject &content_object);
virtual void afterDataUnsatisfied(uint64_t segment);
virtual void updateStats(uint32_t suffix, uint64_t rtt,
utils::TimePoint &now);
private:
void init();
void onContentObject(Interest::Ptr &&i, ContentObject::Ptr &&c) override;
void onContentSegment(Interest::Ptr &&interest,
ContentObject::Ptr &&content_object);
void onPacketDropped(Interest::Ptr &&interest,
ContentObject::Ptr &&content_object) override;
void onReassemblyFailed(std::uint32_t missing_segment) override;
void onTimeout(Interest::Ptr &&i) override;
virtual void scheduleNextInterests() override;
bool sendInterest(std::uint64_t next_suffix);
void sendInterest(Interest::Ptr &&interest);
void onContentReassembled(std::error_code ec) override;
void updateRtt(uint64_t segment);
void RAAQM();
void updatePathTable(const ContentObject &content_object);
void checkDropProbability();
void checkForStalePaths();
void printRtt();
protected:
// Congestion window management
double current_window_size_;
// Protocol management
uint64_t interests_in_flight_;
std::array<std::uint32_t, buffer_size> interest_retransmissions_;
std::array<utils::TimePoint, buffer_size> interest_timepoints_;
std::queue<Interest::Ptr> interest_to_retransmit_;
private:
/**
* Current download path
*/
RaaqmDataPath *cur_path_;
/**
* Hash table for path: each entry is a pair path ID(key) - path object
*/
PathTable path_table_;
// TimePoints for statistic
utils::TimePoint t0_;
bool set_interest_filter_;
// for rate-estimation at packet level
IcnRateEstimator *rate_estimator_;
// params for autotuning
bool raaqm_autotune_;
double default_beta_;
double default_drop_;
double beta_wifi_;
double drop_wifi_;
double beta_lte_;
double drop_lte_;
unsigned int wifi_delay_;
unsigned int lte_delay_;
bool schedule_interests_;
};
} // end namespace protocol
} // end namespace transport
|