From aceee7e0dead2fd661685e414fef08855531c273 Mon Sep 17 00:00:00 2001 From: peiwen865678017 <865678017peiwen@gmail.com> Date: Fri, 27 Jan 2023 20:33:10 +0800 Subject: [PATCH] vegas --- README.md | 17 +- quic/model/cc-algo/vegas_sender.cc | 234 ++++++++++++++++++++++ quic/model/cc-algo/vegas_sender.h | 113 +++++++++++ quic/model/ns3-quic-congestion-factory.cc | 5 + quic/model/ns3-quic-congestion-factory.h | 1 + quic/wscript | 1 + results/1-vegas-goodput.png | Bin 0 -> 6714 bytes results/1-vegas-inflight.png | Bin 0 -> 5067 bytes results/1-vegas-owd.png | Bin 0 -> 6464 bytes results/1-vegas-send-rate.png | Bin 0 -> 6632 bytes scratch/quic-main.cc | 3 + 11 files changed, 365 insertions(+), 9 deletions(-) create mode 100644 quic/model/cc-algo/vegas_sender.cc create mode 100644 quic/model/cc-algo/vegas_sender.h create mode 100644 results/1-vegas-goodput.png create mode 100644 results/1-vegas-inflight.png create mode 100644 results/1-vegas-owd.png create mode 100644 results/1-vegas-send-rate.png diff --git a/README.md b/README.md index e086904..7fc520b 100755 --- a/README.md +++ b/README.md @@ -52,13 +52,7 @@ source /etc/profile ``` # Run example 1 put the file quic-main.cc(scratch) to ns3.33/scratch/ -2 set string varible quic_cert_path in quic-main.cc -3 set string varible log_path in quic-main.cc to collect traced data. -``` -std::string quic_cert_path("/home/xxx/quiche/utils/data/quic-cert/"); -std::string log_path=std::string("/home/xxx/traces/")+algo+"/"; -``` -3 Run example(BBR) +2 Run example(BBR) ``` source /etc/profile ./waf --run "scratch/quic-main --cc=bbr" @@ -73,8 +67,8 @@ data can be found under folder ("/home/xxx/traces/") copy the file plot-script/data_plot.sh to "/home/xxx/traces/bbr" plot the results: ``` -chmod 777 data_plot.sh -./data_plot.sh +chmod 777 data-plot.sh +./data-plot.sh ``` ## bbr inflight packets: @@ -95,3 +89,8 @@ one way delay: ![avatar](https://github.com/SoonyangZhang/quic-on-ns3/blob/main/results/1-copa-owd.png) goodput: ![avatar](https://github.com/SoonyangZhang/quic-on-ns3/blob/main/results/1-copa-goodput.png) +## vegas +one way delay: +![avatar](https://github.com/SoonyangZhang/quic-on-ns3/blob/main/results/1-vegas-owd.png) +goodput: +![avatar](https://github.com/SoonyangZhang/quic-on-ns3/blob/main/results/1-vegas-goodput.png) diff --git a/quic/model/cc-algo/vegas_sender.cc b/quic/model/cc-algo/vegas_sender.cc new file mode 100644 index 0000000..be1a3ab --- /dev/null +++ b/quic/model/cc-algo/vegas_sender.cc @@ -0,0 +1,234 @@ +#include "vegas_sender.h" +#include "../model/ns3-quic-congestion-factory.h" +#include +#include +#include +#include + +#include "gquiche/quic/core/congestion_control/rtt_stats.h" +#include "gquiche/quic/core/quic_time.h" +#include "gquiche/quic/core/quic_time_accumulator.h" +#include "gquiche/quic/platform/api/quic_bug_tracker.h" +#include "gquiche/quic/platform/api/quic_flag_utils.h" +#include "gquiche/quic/platform/api/quic_flags.h" +#include "gquiche/quic/platform/api/quic_logging.h" + +namespace quic{ +namespace{ + const QuicByteCount kDefaultMinimumCongestionWindow = 4 *kDefaultTCPMSS; + const QuicByteCount kAlphaCongestionWindow=2*kDefaultTCPMSS; + const QuicByteCount kBetaCongestionWindow=4*kDefaultTCPMSS; + const QuicByteCount kGammaCongestionWindow=1*kDefaultTCPMSS; + const QuicTime::Delta kMinRTTWindowLength = QuicTime::Delta::FromSeconds(10); +} + +VegasSender::VegasSender(QuicTime now, + const RttStats* rtt_stats, + const QuicUnackedPacketMap* unacked_packets, + QuicPacketCount initial_tcp_congestion_window, + QuicPacketCount max_tcp_congestion_window, + QuicRandom* random, + QuicConnectionStats* stats): +rtt_stats_(rtt_stats), +unacked_packets_(unacked_packets), +random_(random), +stats_(stats), +congestion_window_(initial_tcp_congestion_window * kDefaultTCPMSS), +initial_congestion_window_(initial_tcp_congestion_window *kDefaultTCPMSS), +max_congestion_window_(max_tcp_congestion_window * kDefaultTCPMSS), +min_congestion_window_(kDefaultMinimumCongestionWindow), +slowstart_threshold_(max_tcp_congestion_window * kDefaultTCPMSS), +pacing_rate_(QuicBandwidth::Zero()), +baseRTTFilter_(kMinRTTWindowLength.ToMicroseconds(),QuicTime::Delta::Zero(),0), +min_rtt_(QuicTime::Delta::Infinite()), +rtt_count_(0), +num_acked_packets_(0), +vegas_mode_(true){ + if (stats_) { + // Clear some startup stats if |stats_| has been used by another sender, + // which happens e.g. when QuicConnection switch send algorithms. + stats_->slowstart_count = 0; + stats_->slowstart_duration = QuicTimeAccumulator(); + } +} +VegasSender::~VegasSender(){} + +bool VegasSender::InSlowStart() const{ + return GetCongestionWindow() < GetSlowStartThreshold(); +} +bool VegasSender::InRecovery() const{ + return largest_acked_packet_number_.IsInitialized() && + largest_sent_at_last_cutback_.IsInitialized() && + largest_acked_packet_number_ <= largest_sent_at_last_cutback_; +} +bool VegasSender::ShouldSendProbingPacket() const{ + return false; +} +void VegasSender::SetInitialCongestionWindowInPackets(QuicPacketCount congestion_window){ + if(InSlowStart()){ + initial_congestion_window_ = congestion_window * kDefaultTCPMSS; + congestion_window_ = congestion_window * kDefaultTCPMSS; + } +} + +void VegasSender::OnCongestionEvent(bool rtt_updated, + QuicByteCount prior_in_flight, + QuicTime event_time, + const AckedPacketVector& acked_packets, + const LostPacketVector& lost_packets){ + if(acked_packets.size()>0){ + auto vrtt=rtt_stats_->latest_rtt()+QuicTime::Delta::FromMicroseconds(1); + QuicTime::Delta wall_time=event_time-QuicTime::Zero(); + baseRTTFilter_.Update(vrtt,wall_time.ToMicroseconds()); + if(min_rtt_>vrtt){ + min_rtt_=vrtt; + } + rtt_count_++; + } + bool before=InRecovery(); + + for (const LostPacket& lost_packet : lost_packets) { + OnPacketLost(lost_packet.packet_number, lost_packet.bytes_lost, + prior_in_flight); + } + for (const AckedPacket& acked_packet : acked_packets) { + OnPacketAcked(acked_packet.packet_number, acked_packet.bytes_acked, + prior_in_flight, event_time); + } + if(InRecovery()!=before){ + if(InRecovery()){ + //vegas_disable + vegas_mode_=false; + }else{ + //vegas_enable + vegas_mode_=true; + beg_send_next_=largest_sent_packet_number_; + min_rtt_=QuicTime::Delta::Infinite(); + rtt_count_=0; + } + } +} +void VegasSender::OnPacketSent(QuicTime sent_time, + QuicByteCount bytes_in_flight, + QuicPacketNumber packet_number, + QuicByteCount bytes, + HasRetransmittableData is_retransmittable){ + QUICHE_DCHECK(!largest_sent_packet_number_.IsInitialized() || + largest_sent_packet_number_ < packet_number); + largest_sent_packet_number_ = packet_number; + if(!beg_send_next_.IsInitialized()){ + beg_send_next_=largest_sent_packet_number_; + } +} +void VegasSender::OnRetransmissionTimeout(bool /*packets_retransmitted*/){ + +} +bool VegasSender::CanSend(QuicByteCount bytes_in_flight){ + return bytes_in_flightSmoothedOrInitialRtt(); + const QuicBandwidth bandwidth = + QuicBandwidth::FromBytesAndTimeDelta(GetCongestionWindow(), srtt); + return bandwidth * (InSlowStart() ? 2 : (InRecovery() ? 1 : 1.25)); +} +QuicBandwidth VegasSender::BandwidthEstimate() const { + QuicTime::Delta srtt = rtt_stats_->smoothed_rtt(); + if (srtt.IsZero()) { + // If we haven't measured an rtt, the bandwidth estimate is unknown. + return QuicBandwidth::Zero(); + } + return QuicBandwidth::FromBytesAndTimeDelta(GetCongestionWindow(), srtt); +} +QuicByteCount VegasSender::GetCongestionWindow() const { + return congestion_window_; +} +QuicByteCount VegasSender::GetSlowStartThreshold() const{ + return slowstart_threshold_; +} +CongestionControlType VegasSender::GetCongestionControlType() const{ + return (CongestionControlType)kVegas; +} +std::string VegasSender::GetDebugState() const{ + return "copa"; +} +void VegasSender::OnPacketLost(QuicPacketNumber packet_number, + QuicByteCount lost_bytes, + QuicByteCount prior_in_flight){ + if (largest_sent_at_last_cutback_.IsInitialized() &&packet_number <= largest_sent_at_last_cutback_) { + return; + } + congestion_window_=congestion_window_/2; + congestion_window_=std::max(congestion_window_,min_congestion_window_); + slowstart_threshold_ = congestion_window_; + largest_sent_at_last_cutback_=largest_sent_packet_number_; + num_acked_packets_ = 0; +} +void VegasSender::OnPacketAcked(QuicPacketNumber acked_packet_number, + QuicByteCount acked_bytes, + QuicByteCount prior_in_flight, + QuicTime event_time){ + largest_acked_packet_number_.UpdateMax(acked_packet_number); + if(!vegas_mode_){ + //reno mode + IncreaseCongestionWindowAsReno(); + return ; + } + QUICHE_CHECK(beg_send_next_.IsInitialized()); + if(acked_packet_number>=beg_send_next_){ + beg_send_next_=largest_sent_packet_number_; + if(rtt_count_<=2){ + IncreaseCongestionWindowAsReno(); + }else{ + QuicTime::Delta base_rtt=baseRTTFilter_.GetBest(); + QuicByteCount target_cwnd=congestion_window_*base_rtt.ToMicroseconds()/min_rtt_.ToMicroseconds(); + target_cwnd=((target_cwnd+kDefaultTCPMSS-1)/kDefaultTCPMSS)*kDefaultTCPMSS; + QUICHE_CHECK(min_rtt_>=base_rtt); + QuicByteCount diff=congestion_window_*(min_rtt_.ToMicroseconds()-base_rtt.ToMicroseconds())/base_rtt.ToMicroseconds(); + if(diff>kGammaCongestionWindow&&InSlowStart()){ + /* Going too fast. Time to slow down + * and switch to congestion avoidance. + */ + + /* Set cwnd to match the actual rate + * exactly: + * cwnd = (actual rate) * baseRTT + * Then we add 1 because the integer + * truncation robs us of full link + * utilization. + */ + congestion_window_=std::min(congestion_window_,target_cwnd); + slowstart_threshold_=congestion_window_; + }else if(InSlowStart()){ + congestion_window_ += kDefaultTCPMSS; + }else{ + if(diff>kBetaCongestionWindow){ + if(congestion_window_>min_congestion_window_){ + congestion_window_-=kDefaultTCPMSS; + } + }else if(diff=congestion_window_) { + congestion_window_ += kDefaultTCPMSS; + num_acked_packets_ = 0; + } + } +} +} diff --git a/quic/model/cc-algo/vegas_sender.h b/quic/model/cc-algo/vegas_sender.h new file mode 100644 index 0000000..136d6be --- /dev/null +++ b/quic/model/cc-algo/vegas_sender.h @@ -0,0 +1,113 @@ +#pragma once +#include +#include +#include + +#include "gquiche/quic/core/congestion_control/bandwidth_sampler.h" +#include "gquiche/quic/core/congestion_control/send_algorithm_interface.h" +#include "gquiche/quic/core/congestion_control/windowed_filter.h" +#include "gquiche/quic/core/crypto/quic_random.h" +#include "gquiche/quic/core/quic_bandwidth.h" +#include "gquiche/quic/core/quic_packet_number.h" +#include "gquiche/quic/core/quic_packets.h" +#include "gquiche/quic/core/quic_time.h" +#include "gquiche/quic/core/quic_unacked_packet_map.h" +#include "gquiche/quic/platform/api/quic_export.h" +#include "gquiche/quic/platform/api/quic_flags.h" +namespace quic{ +class RttStats; +QUIC_EXPORT_PRIVATE class VegasSender:public SendAlgorithmInterface{ +public: + VegasSender(QuicTime now, + const RttStats* rtt_stats, + const QuicUnackedPacketMap* unacked_packets, + QuicPacketCount initial_tcp_congestion_window, + QuicPacketCount max_tcp_congestion_window, + QuicRandom* random, + QuicConnectionStats* stats); + VegasSender(const VegasSender&) = delete; + VegasSender& operator=(const VegasSender&) = delete; + ~VegasSender() override; + + // Start implementation of SendAlgorithmInterface. + bool InSlowStart() const override; + bool InRecovery() const override; + bool ShouldSendProbingPacket() const override; + + void SetFromConfig(const QuicConfig& config, + Perspective perspective) override{} + void ApplyConnectionOptions(const QuicTagVector& connection_options) override{} + + void AdjustNetworkParameters(const NetworkParams& params) override{} + void SetInitialCongestionWindowInPackets( + QuicPacketCount congestion_window) override; + void OnCongestionEvent(bool rtt_updated, + QuicByteCount prior_in_flight, + QuicTime event_time, + const AckedPacketVector& acked_packets, + const LostPacketVector& lost_packets) override; + void OnPacketSent(QuicTime sent_time, + QuicByteCount bytes_in_flight, + QuicPacketNumber packet_number, + QuicByteCount bytes, + HasRetransmittableData is_retransmittable) override; + void OnPacketNeutered(QuicPacketNumber packet_number) override{} + void OnRetransmissionTimeout(bool /*packets_retransmitted*/) override; + void OnConnectionMigration() override {} + bool CanSend(QuicByteCount bytes_in_flight) override; + QuicBandwidth PacingRate(QuicByteCount bytes_in_flight) const override; + QuicBandwidth BandwidthEstimate() const override; + QuicByteCount GetCongestionWindow() const override; + QuicByteCount GetSlowStartThreshold() const override; + CongestionControlType GetCongestionControlType() const override; + std::string GetDebugState() const override; + void OnApplicationLimited(QuicByteCount bytes_in_flight) override{} + void PopulateConnectionStats(QuicConnectionStats* stats) const override{} + // End implementation of SendAlgorithmInterface. + +private: + + void OnPacketLost(QuicPacketNumber largest_loss, + QuicByteCount lost_bytes, + QuicByteCount prior_in_flight); + void OnPacketAcked(QuicPacketNumber acked_packet_number, + QuicByteCount acked_bytes, + QuicByteCount prior_in_flight, + QuicTime event_time); + void IncreaseCongestionWindowAsReno(); + // Determines the appropriate pacing rate for the connection. + void CalculatePacingRate(); + + const RttStats* rtt_stats_; + const QuicUnackedPacketMap* unacked_packets_; + QuicRandom* random_; + QuicConnectionStats* stats_; + + // Track the largest packet that has been sent. + QuicPacketNumber largest_sent_packet_number_; + // Track the largest packet that has been acked. + QuicPacketNumber largest_acked_packet_number_; + // Track the largest packet number outstanding when a CWND cutback occurs. + QuicPacketNumber largest_sent_at_last_cutback_; + // The maximum allowed number of bytes in flight. + QuicByteCount congestion_window_; + // The initial value of the |congestion_window_|. + QuicByteCount initial_congestion_window_; + // The largest value the |congestion_window_| can achieve. + QuicByteCount max_congestion_window_; + // The smallest value the |congestion_window_| can achieve. + QuicByteCount min_congestion_window_; + // Slow start congestion window in bytes, aka ssthresh. + QuicByteCount slowstart_threshold_; + // The current pacing rate of the connection. + QuicBandwidth pacing_rate_; + using RTTFilter=WindowedFilter,uint64_t,uint64_t> ; + RTTFilter baseRTTFilter_; + QuicTime::Delta min_rtt_; + int32_t rtt_count_; + QuicPacketNumber beg_send_next_; + uint64_t num_acked_packets_; + bool vegas_mode_; + +}; +} \ No newline at end of file diff --git a/quic/model/ns3-quic-congestion-factory.cc b/quic/model/ns3-quic-congestion-factory.cc index 5bb9811..2ec60b5 100644 --- a/quic/model/ns3-quic-congestion-factory.cc +++ b/quic/model/ns3-quic-congestion-factory.cc @@ -5,6 +5,7 @@ #include "ns3-quic-congestion-factory.h" #include "ns3-quic-no-destructor.h" #include "cc-algo/copa_sender.h" +#include "cc-algo/vegas_sender.h" namespace quic{ class Ns3QuicCongestionFactory:public AbstractCongestionFactory{ public: @@ -50,6 +51,10 @@ SendAlgorithmInterface* Ns3QuicCongestionFactory::Create( algo=new CopaSender(clock->ApproximateNow(), rtt_stats, unacked_packets, initial_congestion_window, max_congestion_window, random, stats); + }else if(kVegas==v){ + algo=new VegasSender(clock->ApproximateNow(), rtt_stats, unacked_packets, + initial_congestion_window, max_congestion_window, + random, stats); }else{ algo=new TcpCubicSenderBytes(clock, rtt_stats, true /* use Reno */, initial_congestion_window, diff --git a/quic/model/ns3-quic-congestion-factory.h b/quic/model/ns3-quic-congestion-factory.h index 1a1a2b4..8c09cb7 100644 --- a/quic/model/ns3-quic-congestion-factory.h +++ b/quic/model/ns3-quic-congestion-factory.h @@ -4,6 +4,7 @@ namespace quic{ enum CongestionControlType2{ kCC0=CongestionControlType::kBBRv2, kCopa, + kVegas, }; void RegisterExternalCongestionFactory(); } \ No newline at end of file diff --git a/quic/wscript b/quic/wscript index 7d7c225..f200eb1 100644 --- a/quic/wscript +++ b/quic/wscript @@ -28,6 +28,7 @@ def build(bld): module.env.append_value("LIB", ["quiche_shared",'protobuf']) module.source = [ 'model/cc-algo/copa_sender.cc', + 'model/cc-algo/vegas_sender.cc', 'model/ns3-client-network-helper.cc', 'model/ns3-packet-writer.cc', 'model/ns3-quic-alarm-engine.cc', diff --git a/results/1-vegas-goodput.png b/results/1-vegas-goodput.png new file mode 100644 index 0000000000000000000000000000000000000000..0dec5f6d80c7e4880767a3a78b3c085c484c187b GIT binary patch literal 6714 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 literal 0 HcmV?d00001 diff --git a/results/1-vegas-inflight.png b/results/1-vegas-inflight.png new file mode 100644 index 0000000000000000000000000000000000000000..a3da305c936d9ce54323a3652a422184c8afc07b GIT binary patch literal 5067 zcmcgwdpK0z*FSS+Vn}905!H-)g+X$QW+u6$Tq>19Oym;M&N|Q8d+oi}XRWo@*?XOH{g9Q} zI$>#H007pR?>9aI03ZYaC=M2la6p`DJJKN^vN&o2!|?Iq5g^s?&6_tA3dPCEsivl; zx3`x-AUt~XsJgm34JL-d)FxJ8EnJ)SvS|vQYAQ{IVHONSFpCAJ(cv^2oJNHqDg*%# z4Tfkeev>KzNgxCq^HPsLMD0%Nz6*Sw2%ms6fi#FXH}|dV+S;m8uc^V9k%UXjkS}Zk zOhFLLJOoSJ0h&L;0CK^R&0_%21OU*cO>_W=1^}28Z7UZo2f$3=4AKMO4xnIS0)AOL z(H+i#;i+R&d0z+PC*r4e?nL|=7#R5Q;RB1sDk>^UN=jlfnQm@wmX?-UT3XW5(nuVr zoK_eHGI#7?!e0ZSc8-P0amERGf??34W0HSsL8+A`bR0aUnE14VbJsR|Iyj$qfS z=>b8M=lgy#(YQK1OT-9E(iwuw#ckilO87Pe#ZNO8iNll;Axyh%UHz0HDX~&ibmgwq-7V!c;?%oQfYvcj z_h;f=Bdf-v!F{sxf+vnPY1;<3wK*~6ri-T}D$uGA)k@K!HNEvi*95=Hq|M}=`x(Ba z^`JD38`bz{3SODHE-13XL^tsbFS}5k%0AUL@N7BW^@@1Erchz!+szY{h?F?=j#KPQ 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 literal 0 HcmV?d00001 diff --git a/results/1-vegas-owd.png b/results/1-vegas-owd.png new file mode 100644 index 0000000000000000000000000000000000000000..789a3ca07714ac22e2143306592ec9d802dc51a3 GIT binary patch literal 6464 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 literal 0 HcmV?d00001 diff --git a/results/1-vegas-send-rate.png b/results/1-vegas-send-rate.png new file mode 100644 index 0000000000000000000000000000000000000000..07d592c1875417a83103d6cc28addf0f5f171e50 GIT binary patch literal 6632 zcmbVR2UHYKliwM3amfoTK|ok?P{{}a!je>wAUO!Kpdd*B1qBrtK$0k^pk!DP7bFV^ zNF1^#NlA(VizHDA26EUNzwf(y_x02N29e-D zMIs);BM-{jTkhUz;y8Ic88x^Ru|#`{B144L)laq2OpP_(D|2@i9$nvpF4GK9D-c8r zJ59qUq59s^P{@xK)AtR9>P4ZT{rmk;sCX2LCL3=n5-))B6iKr&i3^5z%X1{S(%oW78Vxf?(S}4Vxpv^#K*^n%ma}+ zK%=3a%E*M#h7fCr(4R5nNe~RtP!N#@6LdVMUcExWL=i@h@WHK2MM}`<< z{^E|5fB*|qOB8YL{U3tC@1*?|6pFR|&mVYrkd+^W;?*$wBp04?_KtA)t!fsy*cgnlNT6hSB;66%YdS6W#DwS z^bksoDnq)M!yzv{XtZnkh-vQ^maWsAXx%3be0)$ETI0Bqr5B`}03P?B6{9ZO(wu3R z+k*Gi9=-(5**hGyZV_(~%mF*c72+GS?pf5K@ymF_3qslO++J&kK75X~=a5lLP4U2DNpF`9n`JXwQF`H(>Zg(O33k z8AnQ|^$8u~z_abRXNIs?JnnQjH2-)`F%8}GixJ?$2JzjmyEA~bJMXqz$USJmGF5FO zLI#2UCvw2_A;Vu4r#aPr`J|F!AQo(pU>4+g&cVFUJKx`&@*=9&3vET91_yu=<4?C~ zUq=tc{gg?_7-j;(OpC>0A@U$Y>UvU2h34TRkoQ}9wUqm1EN79>y-N`%L=$p9zu8>qVMqt~N zarhdWhB4jAX6ZE zq^ME`WRC6fXVzCU%x*HJiuv0V*>sx!N_0Euco3wIb~D1qX_Br`}~<} zs~K_)CydMZemyt~kF{5-3-bnX@LT?Tu~jlV-EI_d7UNUtG}=%S=l@d9wa$`{3(W5B z{0Ce75KvUGP|#I4o?fN;Hb)6}7rNk*@j$y|QgiAhV?zDo*JA1_uIgZR)IU|7$xdR& ztsFw;Z+olvATnpw`7>;YZGRV(37{hXl+Gt>BJ)jb4IW3A(-wkhZ#m)T4P=B2%bjmH zypBJunS2kIx6Y9rD#;7;JWpv z<4jJ4kp1~%yyaUQIC;CixYPuwJn4!EWw|UuRnPqf($`Ew>_UJpNmA0l*qPo))xfwJ zjVO;aQNpok9F=xePx(v|GCq#_yDa#>=f{6>CPc{M$toxRYTI7|kmHmS9z7%TTnZZt zAt4Ihj(`Hpko>FuDwjY~vR_U2fgfCBP*W-ij)!s^OyH}R_wZ=^Ob95eL)5|H00TtL z>qGi37SBCFhCvb?fcYVy(AbltYhaxCIZuK`@^o+RVtz<86tThO$0roB8RyuJtWYxN z7-VpSk=MAqRR?ASB0r;nCv^+9o#unQ%o46!R`8xB8sF6nMOhqpC^kuGi7P@wseS-gLhRn zAxtQy=LXHn-!>(BO5gYdO#GqA`u>i#WMHtZoU-UU7Z&|9BhE?esngbQo{wRX7~>(= zEea$h)pkQd)Td+_e?aab%tfGXLBdgEvGtH2x{X z8w9B0SGEHuX33CRkQVm6@AC>K`fN6EY+V;l3XXxgN?!<5F$D5ONq6Z?R&ea9E>waiC>Iz!5u3d6Uj9fRn69Ot~PZ>KFQuW8ZvYQJT&l)F9?XmaQ2I#&v9&UZv zKeQ}Hx|Te7`e5Wf$4+1vYy7p6^QJ0Llor2oEt5WXu>G49^#FRvm**`y@7S04U6Ar) zWxz1(*`zMq&A+(mKm}q0_Q z`%IMj(cgp4U39{tIUgEo+pC?tHROu|*Scn8e&oEIBnFT{SE|C2Dw4GlTOacXydnnJ zfnJe=6P!Vqb^cgZ8zMzoU@DaEZ3|Y7wTnRYN17hE2Ti|y5z|c|b829$p7h&utJ1yI zvJ8uc^cVw9W`2++AHkaN4?F-HU2S<|*9=Hj`b55b$D%ec;x%8nyFjtpt*< z`;we@_1IU6V;8oINb9i+F_`4TpsfHi<%WnjS+D(fBir#sdWVSbw_Y)+DJ`vnGHW(1 zf!}<)EM1}z6Nn2FB9uvU_z2Ul%Q&ED*V@lPf42HoNc(TpzT8N5zi1zd!xDik@=Uzv z^QVSYUWH=~r~E&Irt@#m5@g3C0vf`ef-&;K!ylf?qleB$q-zH81D5@&9gP<7hYQHw z#0h*;uPSvc8I8!YT$d%gSYyFbj#%jOU1H3Fom=K8cwE@HyN02*PSy@EiF})KJ(vx! zX48%G!sfDgJn#$|AFWF~)EO_v!}rCOSi`x9r#xm9HhonMN$e#LS7N6`y4iu=`r0hd zc@BBDm*}c39t!lWlAgU>FHG}{y_nmB?Z$&kuogdPbMEfPoiI^=ryp!$6ao|SuZ2<; zB_|&9I4Vc>Xzgl9k$(t%IQ}+>@SJJj0t@3^^9+n~#^z>^%C_vIt@Y}v1C*Ijnq=H0 zQ8*M6u#|bLqettPnC`N>AZ|rz@`7f|WLm~_n)A~15QC@lj#m0KtmSmLzWVb7*e7%D z%DS39@Zxx%G2FkgCI@!0u}jrnicVBe|ssKo5^%8a!I9xwV+6ay#QyCkUB>iS2;Pu~rBqbI=a z7Xo)w4?1B4QmRHCSH~qLH(>4T(E_74JIA)ZNs-KO)+=YwL)^A?k|RwOkr`RWZ;tVu zT%o(Zg7oC z+?Cv;WH8?t^4`k+{gYH8+-!YCqE#x|ENs}WtdxJ<{xC=L^>?P?q_LfiES4*zoNb0L z$2>zc-6hC-%D9pmANFz{%KdZ0#EWlQBm!5WAn)<%xDUV4>t01Am8GZ<(%6 z7}~&`%->nZn>}|dvlou6RflM(rZhfkdcJ;!$FKL*+SW-)>U*}mfYl8n_Z!|}A^Y;% zOkib;M2~~(nnK>HWjMbt8l@!_-_M;H4$hOiwqT4Am@H7QWG59;PiyW+J3dRTKM+>= zAjJIVs`YaP^0DN4C>zoDz-c4Fv~=#$!sNiF;JfsM&0=hU0(;$McKO7L+LisXjo0I$H<_u9Lq`-Zsuko` z^QWIbJXRm7RPu0?+w+N+lTjq}&EDaynH&RG<$7hSf885jk*XwUqV1_|Ki)6<-V55t zklrm@t=DP-o=eVQ$GlGwODan0DC6(EGoWE3r=pKlGBbAidvhOUCDvm16&@|`S3)~p zx+KH0JytbdRq5ua#6Kdhz)X;{c!w_DlE`}${xWPghG~@^b60$}++sPOK=!3bAI;Mk zbahlnDo&5HKKw>wv7~7}SMQ_rI74mv!Cy)I?$O9HeplVb0&K1a@-x;n5(Fk3D@?TQ zYA$uCOn-mJ0`wMhUy}Gyb(bPUpiYU7Jy5jCzp>eqe#P>+atHUfHG#`(Kf2UbKg1p0 zvkn{Xycajxf?pLHq)0U z-8BMwX}^{G@=l?E^~(uRh~W{><_~<=voV?57o_(zuNd%g;|4??Jb!E(BAMcx?<)8z zTPtLDU@4610(LG=SLV(cI(ThG95asmHgzx&WL;F9)(j60A35XsEMpw)$XtkBkphwq zeMS3-jO1m6dwpV^T;Tyq48|L*wq=Wlhc)lTVcwV@0|doM*|sH6+qpxkB9!_AO;c>3 zy2{ui%HsR(yDm4`0F&ApARoMhIT)a|69}?)d@i1!TCSUT|8d2yTzghmelrPuXu80P z<5HA&pw>3#?%zglUcZVrvntOp5G4Rxmm|LG#L5EIp7`1%I2rPE8s?UHq_P zTDS}{7g9JDw`O2`P2;9sEEswOjTib}iA?LU{3as;Sjt+EdW5C&ySEPUL@Rzko$)T@ zj$7e9H|e_5*ccc~Ad99jdhA?!G=8T(0!nZ^M80|@eQ!T_9Rx~x&VSR+2=G~6%n4Xy zA9(Gcb8TDEml0II{1iG!cirq48{qWP4(_nTW{c&3z=4-W#Ko_rYaga}^oX{loPM)K zI>gCOrtrCk&*Xro&83_~qH2Q5+$W5(@;Yun3F`r${-D*@tYt&NV?C(Bl>LABj9-G% zou`GsvmnT)10N(3MJXPBJmJu{hE8pC0~)Oy0og(jlG_;_F*nUPae$o58Q5&yFLG~u zGnf&LZisLKWhvQBAi4pphx+Tf+t`u15YSXBhzT2nu>mG+=1h=|%NaK6jIJ?)XIof- zve!l)1S*#gLy)x=hz80?dT>z%y9mp7d(BC6^3V!&H^PCU>^djSExnB36 zdyDm$GY1iGq^rlrK<-|E**G#rPEEI`$N0t&O@pl-q62);H1tAFrW`J@wCm5Jq<;-t)>yvOLm zaMDpjSVC*7oFJrdKzH^$K*wN%ZMpmaauaxH)OuQkqF0b<4IU4+NbWG2@k$w*+RQx4 zY?+MQ95ba!PK(hTh}2AS>;hkK+B*h7Lz1E3cD;(fcCw;?i*#~l%#nHFR8|xM{c)yT@-v;N+KQi8btuG4S+gN@1#faEad3vaCQ4KKrlenE_Ns&GF zQm=20G6Z>XeVV6^Tl+=6vX9NEI$uQEG~5bKYpUmbNATyaW9Ru`8v8{oWRQ6MSYs{(KNgH(uc;y8cS~^Q=HjbI*u$+T1hQOi?L|6w`}^E( z$@%_H3*2tmb6@uZ)@fF5nG}r54?OyJ2Z1#7iEB)2ANl1m)xM#Or8%FSj0mWS7j4z| zOjpj@EYCv-d+&$|T<4PqW=BFzc0A?HI@Omz8&4hiN(}Z3lO6(lN6+g%RhSY$jze-I zXrHrO!4$z%^FVJB8qw9jvkq7O>ZkIv;X4_ohNf~s0JtU6U2$HRq{PabzZh7X=?{zl g8~FNHVuy|QYU}G$8v6r~Zwx3y15^D{T~fq<048Ir%>V!Z literal 0 HcmV?d00001 diff --git a/scratch/quic-main.cc b/scratch/quic-main.cc index 89a5f1e..d67185d 100644 --- a/scratch/quic-main.cc +++ b/scratch/quic-main.cc @@ -89,6 +89,9 @@ void test_app(Time app_start,Time app_stop,uint8_t client_log_flag, }else if(0==cc_name.compare("copa")){ cc_type=static_cast(quic::kCopa); algo=cc_name; + }else if(0==cc_name.compare("vegas")){ + cc_type=static_cast(quic::kVegas); + algo=cc_name; } std::string log_path=trace_folder+cc_name+"/";