Skip to content

Commit ec37339

Browse files
committed
add razor trace
1 parent a098248 commit ec37339

9 files changed

+168
-24
lines changed

razor-ns3/model/razortrace.cc

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
#include <unistd.h>
2+
#include <memory.h>
3+
#include "razortrace.h"
4+
#include "ns3/simulator.h"
5+
#include "ns3/log.h"
6+
namespace ns3{
7+
void RazorTraceReceiver::OpenTraceLossFile(std::string name){
8+
char buf[FILENAME_MAX];
9+
memset(buf,0,FILENAME_MAX);
10+
std::string path = std::string (getcwd(buf, FILENAME_MAX)) + "/traces/"
11+
+name+"_loss.txt";
12+
m_lossSeq.open(path.c_str(), std::fstream::out);
13+
}
14+
void RazorTraceReceiver::CloseTraceLossFile(){
15+
if(m_lossSeq.is_open()){
16+
m_lossSeq.close();
17+
}
18+
}
19+
void RazorTraceReceiver::OnLossSeq(uint32_t seq){
20+
if(m_lossSeq.is_open()){
21+
char line [256];
22+
memset(line,0,256);
23+
//double now=Simulator::Now().GetSeconds();
24+
sprintf (line, "%d",seq);
25+
m_lossSeq<<line<<std::endl;
26+
}
27+
}
28+
void RazorTraceReceiver::Close(){
29+
CloseTraceLossFile();
30+
}
31+
void RazorTraceSender::OpenTraceSentFile(std::string name){
32+
char buf[FILENAME_MAX];
33+
memset(buf,0,FILENAME_MAX);
34+
std::string path = std::string (getcwd(buf, FILENAME_MAX)) + "/traces/"
35+
+name+"_sent.txt";
36+
m_sendSeq.open(path.c_str(), std::fstream::out);
37+
}
38+
void RazorTraceSender::CloseTraceSentFile(){
39+
if(m_sendSeq.is_open()){
40+
m_sendSeq.close();
41+
}
42+
}
43+
void RazorTraceSender::OnSentSeq(uint32_t seq){
44+
if(m_sendSeq.is_open()){
45+
char line [256];
46+
memset(line,0,256);
47+
//double now=Simulator::Now().GetSeconds();
48+
sprintf (line, "%d",seq);
49+
m_sendSeq<<line<<std::endl;
50+
}
51+
}
52+
void RazorTraceSender::Close(){
53+
CloseTraceSentFile();
54+
}
55+
}
56+
57+
58+
59+

razor-ns3/model/razortrace.h

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#ifndef TRACE_RAZORTRACE_H_
2+
#define TRACE_RAZORTRACE_H_
3+
#include <iostream>
4+
#include <fstream>
5+
#include <string>
6+
namespace ns3{
7+
class RazorTraceReceiver{
8+
public:
9+
RazorTraceReceiver(){}
10+
~RazorTraceReceiver(){
11+
Close();
12+
}
13+
void OpenTraceLossFile(std::string name);
14+
void CloseTraceLossFile();
15+
void OnLossSeq(uint32_t seq);
16+
private:
17+
void Close();
18+
std::fstream m_lossSeq;
19+
};
20+
class RazorTraceSender{
21+
public:
22+
RazorTraceSender(){}
23+
~RazorTraceSender(){
24+
Close();
25+
}
26+
void OpenTraceSentFile(std::string name);
27+
void CloseTraceSentFile();
28+
void OnSentSeq(uint32_t seq);
29+
private:
30+
void Close();
31+
std::fstream m_sendSeq;
32+
};
33+
}
34+
#endif /* TRACE_RAZORTRACE_H_ */

razor-ns3/model/sim_endpoint.cc

+9-3
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,9 @@ void SimEndpoint::CalculateRtt(uint32_t keep_rtt)
382382
void SimEndpoint::SenderInit()
383383
{
384384
m_sender=new SimSender();
385+
if(!m_sentSeqCb.IsNull()){
386+
m_sender->SetSentSeqTrace(m_sentSeqCb);
387+
}
385388
sim_header_t sHeader;
386389
INIT_SIM_HEADER(sHeader,RazorProtoType::MIN_MSG_ID,m_uid);
387390
m_sender->SetHeader(sHeader);
@@ -398,21 +401,24 @@ void SimEndpoint::ReceiverInit()
398401
if(m_receiver==nullptr)
399402
{
400403
m_receiver=new SimReceiver();
404+
if(!m_lossSeqCb.IsNull()){
405+
m_receiver->SetLossSeqTrace(m_lossSeqCb);
406+
}
401407
sim_header_t sHeader;
402408
INIT_SIM_HEADER(sHeader,RazorProtoType::MIN_MSG_ID,m_uid);
403409
m_receiver->SetHeader(sHeader);
404410
m_receiver->SetFeedBack(MakeCallback(&SimEndpoint::Send,this));
405411
}
406412
}
407-
void SimEndpoint::ChangeRate(uint32_t bitrate)
413+
void SimEndpoint::ChangeRate(uint32_t kbps)
408414
{
409-
uint32_t rate=bitrate*1000;
415+
uint32_t rate=kbps*1000;
410416
double now=Simulator::Now().GetSeconds();
411417
NS_LOG_INFO(now<<" "<<m_bitRate/1000<<" "<<rate/1000);
412418
m_bitRate=rate;
413419
if(rate<=0)
414420
{
415-
NS_LOG_FUNCTION("fuck insane bitrate"<<bitrate<< "and set it to min");
421+
NS_LOG_FUNCTION("fuck insane bitrate"<<kbps<< "and set it to min");
416422
m_bitRate=SIM_MIN_BITRATE;
417423
}
418424

razor-ns3/model/sim_endpoint.h

+11-1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,14 @@ class SimEndpoint:public Application
4949
Callback<void,uint32_t>connectionFailed);
5050
void SendPing(void);
5151
void Send(Ptr<Packet> packet);
52+
typedef Callback<void,uint32_t> LossSeqCallback;
53+
void SetLossSeqTrace(LossSeqCallback cb){
54+
m_lossSeqCb=cb;
55+
}
56+
typedef Callback<void,uint32_t> SentSeqCallback;
57+
void SetSentSeqTrace(SentSeqCallback cb){
58+
m_sentSeqCb=cb;
59+
}
5260
private:
5361
void Connect();
5462
virtual void StartApplication ();
@@ -66,7 +74,7 @@ class SimEndpoint:public Application
6674
m_bitRate=bitrate;
6775
m_frameRate=framerate;
6876
}
69-
void ChangeRate(uint32_t bitrate);
77+
void ChangeRate(uint32_t kbps);
7078
void SenderInit();
7179
void ReceiverInit();
7280
void GenerateFakeData();
@@ -102,6 +110,8 @@ class SimEndpoint:public Application
102110

103111
SimSender *m_sender;
104112
SimReceiver *m_receiver;
113+
LossSeqCallback m_lossSeqCb;
114+
SentSeqCallback m_sentSeqCb;
105115
};
106116
}
107117
#endif /* SIM_ENDPOINT_H */

razor-ns3/model/sim_receiver.cc

+20-5
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "ns3/packet.h"
77
#include"ns3/log.h"
88
#include "sim_constants.h"
9+
#include <string>
910
namespace ns3
1011
{
1112
NS_LOG_COMPONENT_DEFINE("SimReceiver");
@@ -91,7 +92,7 @@ void SimReceiver::SetFeedBack(Callback<void,Ptr<Packet>>feedback)
9192
}
9293
void SimReceiver::SendFeedback(void*handler,const uint8_t* payload, int payload_size)
9394
{
94-
NS_LOG_FUNCTION(Simulator::Now().GetMilliSeconds());
95+
//NS_LOG_FUNCTION(Simulator::Now().GetMilliSeconds());
9596
SimReceiver *obj=static_cast<SimReceiver*>(handler);
9697
sim_header_t sHeader=obj->m_sHeader;
9798
sHeader.mid=RazorProtoType::SIM_FEEDBACK;
@@ -105,15 +106,29 @@ void SimReceiver::SendFeedback(void*handler,const uint8_t* payload, int payload_
105106
header.SetMessagePayload((void*)&feedback,sizeof(sim_feedback_t));
106107
if(!obj->m_feedback.IsNull())
107108
{
108-
NS_LOG_INFO("send feedback");
109+
//NS_LOG_INFO("send feedback");
109110
Ptr<Packet> packet=Create<Packet>(0);
110111
packet->AddHeader(header);
111112
obj->m_feedback(packet);
112113
}
113114
}
114115
void SimReceiver::RecvFakeData(sim_segment_t seg)
115116
{
116-
NS_LOG_FUNCTION(Simulator::Now().GetMilliSeconds()<<"receive "<<seg.packet_id);
117+
//NS_LOG_FUNCTION(Simulator::Now().GetMilliSeconds()<<"receive "<<seg.packet_id);
118+
if(seg.packet_id!=m_base_seq+1){
119+
uint32_t i=0;
120+
uint32_t from=m_base_seq+1;
121+
uint32_t to=seg.packet_id;
122+
for(i=from;i<to;i++){
123+
if(!m_lossSeqCb.IsNull()){
124+
m_lossSeqCb(i);
125+
}
126+
}
127+
}
128+
m_base_seq=seg.packet_id;
129+
/*if(!m_lossSeqCb.IsNull()){
130+
m_lossSeqCb(seg.packet_id);
131+
}*/
117132
uint8_t header_len=sizeof(sim_header_t)+sizeof(sim_segment_t);
118133
if(m_cc!=NULL)
119134
{
@@ -137,7 +152,7 @@ uint32_t SimReceiver::GetFakeData()
137152
}
138153
void SimReceiver::HeartBeat()
139154
{
140-
NS_LOG_FUNCTION_NOARGS();
155+
//NS_LOG_FUNCTION_NOARGS();
141156
if(m_heartbeatEvent.IsExpired())
142157
{
143158
if(m_cc!=NULL)
@@ -156,7 +171,7 @@ void SimReceiver::StatsRecvRate()
156171
if(m_statsRateEvent.IsExpired())
157172
{
158173
rate=m_statsDataLen*8/(m_rateStatsInterval*0.001);
159-
NS_LOG_INFO("receive bitrate "<<rate);
174+
//NS_LOG_INFO("receive bitrate "<<rate);
160175
m_statsDataLen=0.0;
161176
Time interval=MilliSeconds((uint64_t)m_rateStatsInterval);
162177
m_statsRateEvent=Simulator::Schedule(interval,&SimReceiver::StatsRecvRate,this);

razor-ns3/model/sim_receiver.h

+7
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "ns3/socket.h"
1313
#include "ns3/event-id.h"
1414
#include "ns3/simulator.h"
15+
#include "ns3/callback.h"
1516
#include<vector>
1617
namespace ns3
1718
{
@@ -44,6 +45,10 @@ class SimReceiver
4445
void HeartBeat();
4546
void StatsRecvRate();
4647
void UpdateRtt(uint32_t rtt,uint32_t rtt_var);
48+
typedef Callback<void,uint32_t> LossSeqCallback;
49+
void SetLossSeqTrace(LossSeqCallback cb){
50+
m_lossSeqCb=cb;
51+
}
4752
private:
4853
uint32_t GetIndex(uint32_t i);
4954
//the important part is not about video consuming,so ignore it
@@ -70,6 +75,8 @@ class SimReceiver
7075
EventId m_statsRateEvent;
7176
uint32_t m_rateStatsInterval;//in 100ms;
7277
Callback<void,Ptr<Packet>> m_feedback;
78+
uint32_t m_base_seq{0};
79+
LossSeqCallback m_lossSeqCb;
7380
};
7481
}
7582

razor-ns3/model/sim_sender.cc

+18-13
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,20 @@
44
#include"ns3/log.h"
55
#include"ns3/nstime.h"
66
#include "ns3/packet.h"
7+
#include<string>
78
namespace ns3
89
{
910
NS_LOG_COMPONENT_DEFINE("SimSender");
1011
SimSender::SimSender()
1112
{
12-
m_frame_id=0;
13-
m_packet_id=0;
1413
m_transport_seq=0;
1514
m_active=true;
1615
m_first_ts=-1;
17-
m_remb=0;//0 open receiver bandwidth estimate
16+
m_remb=1;//0 open receiver bandwidth estimate
1817
m_paceTime=5;
1918
m_segmentSize=1000;
2019
m_lossFraction=0;
21-
m_paceQueueLen=300;
20+
m_paceQueueLen=3000; //300; change it
2221
m_maxSplitPackets=1000;
2322
m_cc=razor_sender_create((void*)this,&SimSender::ChangeBitRate,(void*)this,
2423
&SimSender::PacePacketSend,m_paceQueueLen);
@@ -68,7 +67,7 @@ void SimSender::UpdateRtt(uint32_t rtt,uint32_t rtt_var)
6867
}
6968
void SimSender::ProcessFeedBack(sim_feedback_t feedback)
7069
{
71-
NS_LOG_FUNCTION_NOARGS();
70+
//NS_LOG_FUNCTION_NOARGS();
7271
if(m_cc!=NULL)
7372
{
7473
m_cc->on_feedback(m_cc,feedback.feedback,feedback.feedback_size);
@@ -123,10 +122,9 @@ void SimSender::PutFakeData(uint8_t ftype,uint32_t size)
123122
{
124123
timestamp=(uint32_t)(now_ts-m_first_ts);
125124
}
126-
++m_frame_id;
127125
for(i=0;i<total;i++)
128126
{
129-
seg.packet_id=++m_packet_id;
127+
seg.packet_id=m_packet_id;
130128
seg.fid=m_frame_id;
131129
seg.ftype=ftype;
132130
seg.index=i;
@@ -139,7 +137,9 @@ void SimSender::PutFakeData(uint8_t ftype,uint32_t size)
139137
seg.data_size=splits[i];
140138
m_cache.insert(std::make_pair(seg.packet_id,seg));
141139
m_cc->add_packet(m_cc,seg.packet_id,0,seg.data_size+header_len);
140+
m_packet_id++;
142141
}
142+
m_frame_id++;
143143
//NS_LOG_INFO("splits packet "<<total);
144144
}
145145
void SimSender::SetSendSegmentCallback(Callback<void,Ptr<Packet>>sendPacket)
@@ -152,7 +152,7 @@ void SimSender::SetVideoBitChangeCallback(Callback<void,uint32_t> changeBitRate)
152152
}
153153
void SimSender::ChangeBitRate(void* trigger, uint32_t bitrate, uint8_t fraction_loss, uint32_t rtt)
154154
{
155-
NS_LOG_FUNCTION(Simulator::Now().GetMilliSeconds());
155+
double now=Simulator::Now().GetSeconds();
156156
SimSender *obj=static_cast<SimSender*>(trigger);
157157
uint32_t overhead_bitrate, per_packets_second, payload_bitrate, video_bitrate_kbps;
158158
double loss;
@@ -168,20 +168,22 @@ void SimSender::ChangeBitRate(void* trigger, uint32_t bitrate, uint8_t fraction_
168168
{
169169
obj->m_lossFraction=(3*obj->m_lossFraction+fraction_loss)/4;
170170
}
171-
loss=obj->m_lossFraction/255.0;
171+
loss=(double)obj->m_lossFraction/255.0;
172172
if (loss > 0.5)
173173
loss = 0.5;
174174
video_bitrate_kbps = (uint32_t)((1.0 - loss) * payload_bitrate) / 1000;
175-
NS_LOG_INFO("bitrate "<<bitrate<<"change bitrate "<<video_bitrate_kbps<<"kbps");
175+
NS_LOG_INFO(std::to_string(now)<<" "<<video_bitrate_kbps<<" l "<<std::to_string(loss));
176176
if(!obj->m_changeBitRate.IsNull())
177177
{
178-
obj->m_changeBitRate(video_bitrate_kbps);
178+
//to prevent channel overuse
179+
uint32_t protect_rate=video_bitrate_kbps;
180+
obj->m_changeBitRate(protect_rate);//video_bitrate_kbps
179181
}
180182

181183
}
182184
void SimSender::PacePacketSend(void* handler, uint32_t packet_id, int retrans, size_t size)
183185
{
184-
NS_LOG_INFO(Simulator::Now().GetMilliSeconds()<<"packet send "<<packet_id<<"size "<<size);
186+
//NS_LOG_INFO(Simulator::Now().GetMilliSeconds()<<"packet send "<<packet_id<<"size "<<size);
185187
SimSender *obj=static_cast<SimSender*>(handler);
186188
if(!obj->m_sendPacket.IsNull())
187189
{
@@ -197,12 +199,15 @@ void SimSender::PacePacketSend(void* handler, uint32_t packet_id, int retrans, s
197199
segment.send_ts=(uint16_t)(Simulator::Now().GetMilliSeconds()-obj->m_first_ts-segment.timestamp);
198200
segment.transport_seq=++(obj->m_transport_seq);
199201
obj->m_cache.erase(iter);
202+
if(!obj->m_sentSeqCb.IsNull()){
203+
obj->m_sentSeqCb(segment.packet_id);
204+
}
200205
uint8_t header_len=sizeof(sim_header_t)+sizeof(sim_segment_t);
201206
if(obj->m_cc)
202207
{
203208
obj->m_cc->on_send(obj->m_cc,segment.transport_seq,header_len+segment.data_size);
204209
}
205-
NS_LOG_INFO("packet_id"<<packet_id<<"seq"<<segment.transport_seq);
210+
//NS_LOG_INFO("packet_id"<<packet_id<<"seq"<<segment.transport_seq);
206211
sim_header_t sHeader=obj->m_header;
207212
sHeader.mid=RazorProtoType::SIM_SEG;
208213
RazorHeader header;

0 commit comments

Comments
 (0)