Coder Social home page Coder Social logo

signetlabdei / quic-ns-3 Goto Github PK

View Code? Open in Web Editor NEW
43.0 6.0 17.0 99.61 MB

QUIC implementation for ns-3

License: GNU General Public License v2.0

Makefile 0.15% Python 3.64% C++ 93.47% MATLAB 0.15% Click 0.07% C 1.28% Shell 0.03% Perl 1.17% Gnuplot 0.04% Batchfile 0.01%
quic ns-3 simulation

quic-ns-3's Introduction

QUIC implementation for ns-3

QUIC code base

This repository contains in the src/quic and src/applications the code for the implementation of the QUIC protocol for ns-3.

The implementation is described in this paper.

Please use the issue tracker for bugs/questions.

The Network Simulator, Version 3

Table of Contents:

  1. An overview
  2. Building ns-3
  3. Running ns-3
  4. Getting access to the ns-3 documentation
  5. Working with the development version of ns-3

Note: Much more substantial information about ns-3 can be found at http://www.nsnam.org

An Open Source project

ns-3 is a free open source project aiming to build a discrete-event network simulator targeted for simulation research and education.
This is a collaborative project; we hope that the missing pieces of the models we have not yet implemented will be contributed by the community in an open collaboration process.

The process of contributing to the ns-3 project varies with the people involved, the amount of time they can invest and the type of model they want to work on, but the current process that the project tries to follow is described here: http://www.nsnam.org/developers/contributing-code/

This README excerpts some details from a more extensive tutorial that is maintained at: http://www.nsnam.org/documentation/latest/

Building ns-3

The code for the framework and the default models provided by ns-3 is built as a set of libraries. User simulations are expected to be written as simple programs that make use of these ns-3 libraries.

To build the set of default libraries and the example programs included in this package, you need to use the tool 'waf'. Detailed information on how to use waf is included in the file doc/build.txt

However, the real quick and dirty way to get started is to type the command

./waf configure --enable-examples

followed by

./waf

in the directory which contains this README file. The files built will be copied in the build/ directory.

The current codebase is expected to build and run on the set of platforms listed in the release notes file.

Other platforms may or may not work: we welcome patches to improve the portability of the code to these other platforms.

Running ns-3

On recent Linux systems, once you have built ns-3 (with examples enabled), it should be easy to run the sample programs with the following command, such as:

./waf --run simple-global-routing

That program should generate a simple-global-routing.tr text trace file and a set of simple-global-routing-xx-xx.pcap binary pcap trace files, which can be read by tcpdump -tt -r filename.pcap The program source can be found in the examples/routing directory.

Getting access to the ns-3 documentation

Once you have verified that your build of ns-3 works by running the simple-point-to-point example as outlined in 3) above, it is quite likely that you will want to get started on reading some ns-3 documentation.

All of that documentation should always be available from the ns-3 website: http:://www.nsnam.org/documentation/.

This documentation includes:

Working with the development version of ns-3

If you want to download and use the development version of ns-3, you need to use the tool git. A quick and dirty cheat sheet is included in the manual, but reading through the git tutorials found in the Internet is usually a good idea if you are not familiar with it.

If you have successfully installed git, you can get a copy of the development version with the following command:

git clone https://gitlab.com/nsnam/ns-3-dev.git

However, we recommend to follow the Gitlab guidelines for starters, that includes creating a Gitlab account, forking the ns-3-dev project under the new account's name, and then cloning the forked repository. You can find more information in the manual [link].

quic-ns-3's People

Contributors

adrianswtam avatar bpswenson avatar cawka avatar dabrign avatar dizhizhou avatar dnlove avatar ixce avatar kusoof avatar lalithsuresh avatar linlinjava avatar lparcerisa avatar mkbanchi avatar mohittahiliani avatar mrichart avatar mychele avatar natale-p avatar nikkipui avatar pasquimp avatar rajb245 avatar rediet-orange avatar sderonne avatar stavallo avatar thehajime avatar tom5760 avatar tomgoff avatar tomhenderson avatar tommypec avatar vedranmiletic avatar yfcheng avatar zorazeali avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

quic-ns-3's Issues

Wrong port number.

Hi,
When I run a QUIC app, and the server receives a response, the packet has the same dest and origin port number.

It is possible to appreciate this problem when I run quic-variants-comparison.cc with the option pcap_tracing=true.
In this case, packets sent from 10.0.1.1 to 10.0.2.2 have the udp port 49153 and 50000 and received packets (responses) src_port=49153 and dst_port=49153

image

Thank you

Infinite retransmission and inability to accept data packets in 0-RTT mode

Dear development:
I'm trying to use the QUIC module developed by you to build my own application in ns-3.40, but during testing, I encountered issues with infinite retransmission and the inability to receive data packets in 0-RTT mode.

The following is my code.

1. new-quic-node.h

#ifndef NEW_QUIC_NODE_H
#define NEW_QUIC_NODE_H

#include "ns3/application.h"
#include "ns3/event-id.h"
#include "ns3/ptr.h"
#include "ns3/ipv4-address.h"
#include "ns3/traced-callback.h"
#include "ns3/random-variable-stream.h"
#include "ns3/quic-module.h"

#define QUIC_PORT 11000
`
`
namespace std {
template <>
struct hash<ns3::Ipv4Address>
{
    size_t operator()(const ns3::Ipv4Address& addr) const
    {
        return hash<uint32_t>()(addr.Get());
    }
};
}

namespace ns3 {

class Socket;
class Packet;

struct QuicPeer
{
    Ipv4Address address;
    Ptr<Socket> socket;
};

/**
 * \ingroup quicecho
 * \brief A Quic Echo client
 *
 * Every packet sent should be returned by the server and received here.
 */
class NewQuicNode : public Application
{
public:
  /**
   * \brief Get the type ID.
   * \return the object TypeId
   */
  static TypeId GetTypeId (void);

  NewQuicNode ();

  virtual ~NewQuicNode ();

  void SetKnownAddresses (const std::vector<Ipv4Address> &knownAddresses);

  uint32_t GetReceiveCount(void) const;

  /**
   * Set the data size of the packet (the number of bytes that are sent as data
   * to the server).  The contents of the data are set to unspecified (don't
   * care) by this call.
   *
   * \warning If you have set the fill data for the echo client using one of the
   * SetFill calls, this will undo those effects.
   *
   * \param dataSize The size of the echo data you want to sent.
   */
  void SetDataSize (uint32_t dataSize);

  /**
   * Get the number of data bytes that will be sent to the server.
   *
   * \warning The number of bytes may be modified by calling any one of the
   * SetFill methods.  If you have called SetFill, then the number of
   * data bytes will correspond to the size of an initialized data buffer.
   * If you have not called a SetFill method, the number of data bytes will
   * correspond to the number of don't care bytes that will be sent.
   *
   * \returns The number of data bytes.
   */
  uint32_t GetDataSize (void) const;

  /**
   * Set the data fill of the packet (what is sent as data to the server) to
   * the zero-terminated contents of the fill string string.
   *
   * \warning The size of resulting echo packets will be automatically adjusted
   * to reflect the size of the fill string -- this means that the PacketSize
   * attribute may be changed as a result of this call.
   *
   * \param fill The string to use as the actual echo data bytes.
   */
  void SetFill (std::string fill);

  void ScheduleClosing (Time dt);

  /**
   * Set the ID of the stream to be used in the underlying QUIC socket
   *
   * \param streamId the ID of the stream (>0)
   */
  void SetStreamId (uint32_t streamId);

  /**
   * Get the stream ID to be used in the underlying QUIC socket
   *
   * \return the stream ID
   */
  uint32_t GetStreamId (void) const;

protected:
  virtual void DoDispose (void);

private:

  virtual void StartApplication (void);
  virtual void StopApplication (void);

  /**
   * \brief Schedule the next packet transmission
   * \param dt time interval between packets.
   */
  void ScheduleTransmit (Time dt);

  /**
   * \brief Send a packet
   */
  void Send (void);
  void Close (void);

  /**
 * \brief Handle a packet reception.
 *
 * This function is called by lower layers.
 *
 * \param socket the socket the packet was received to.
 */
  void HandleRead (Ptr<Socket> socket);

  void InitListenSocket (void);

  void InitOutgoingConnection(void);

  void HandleConnect (ns3::Ptr<ns3::Socket> socketPtr);

  void traceRTT(std::string address, Time oldTime, Time newTime);

  void traceRTO(std::string address, Time oldTime, Time newTime);

  uint32_t m_count; //!< Maximum number of packets the application will send
  Time m_interval; //!< Packet inter-send time
  uint32_t m_size; //!< Size of the sent packet

  uint32_t m_dataSize; //!< packet payload size (must be equal to m_size)
  uint8_t *m_data; //!< packet payload data

  uint32_t m_sent; //!< Counter for sent packets
  Ptr<Socket> m_socket; //!< Socket
  Address m_peerAddress; //!< Remote peer address
  uint16_t m_peerPort; //!< Remote peer port
  EventId m_sendEvent; //!< Event to send the next packet
  EventId m_closeEvent;
  EventId m_connectEvent;
  Address m_address;
  uint32_t m_countSend;
  uint32_t m_countSendbyt;
  uint16_t m_receiveCount;
  uint32_t m_numStreams;
  uint32_t m_lastUsedStream;
  std::unordered_map<Ipv4Address, QuicPeer> m_peers;
  std::vector<Ipv4Address> m_knownAddresses; 

  /// Callbacks for tracing the packet Tx events
  TracedCallback<Ptr<const Packet> > m_txTrace;
};

} // namespace ns3

#endif /* NEW_QUIC_NODE_H */

2. new-quic-node.cc

#include "ns3/log.h"
#include "ns3/ipv4-address.h"
#include "ns3/ipv6-address.h"
#include "ns3/nstime.h"
#include "ns3/inet-socket-address.h"
#include "ns3/inet6-socket-address.h"
#include "ns3/socket.h"
#include "ns3/simulator.h"
#include "ns3/socket-factory.h"
#include "ns3/packet.h"
#include "ns3/uinteger.h"
#include "ns3/trace-source-accessor.h"
#include "new-quic-node.h"
#include "ns3/quic-header.h"
#include "ns3/double.h"


namespace ns3 {

NS_LOG_COMPONENT_DEFINE ("NewQuicNode");

NS_OBJECT_ENSURE_REGISTERED (NewQuicNode);

TypeId
NewQuicNode::GetTypeId (void)
{
  static TypeId tid = TypeId ("ns3::NewQuicNode")
    .SetParent<Application> ()
    .SetGroupName ("Applications")
    .AddConstructor<NewQuicNode> ()    
    .AddAttribute ("SelfAddress",
                   "The address of this node",
                   AddressValue (),
                   MakeAddressAccessor (&NewQuicNode::m_address),
                   MakeAddressChecker ())
    .AddAttribute ("MaxPackets",
                   "The maximum number of packets the application will send",
                   UintegerValue (1),
                   MakeUintegerAccessor (&NewQuicNode::m_count),
                   MakeUintegerChecker<uint32_t> ())
    .AddAttribute ("Interval",
                   "The time to wait between packets",
                   TimeValue (Seconds (1.0)),
                   MakeTimeAccessor (&NewQuicNode::m_interval),
                   MakeTimeChecker ())
    .AddAttribute ("PacketSize", "Size of echo data in outbound packets",
                   UintegerValue (100),
                   MakeUintegerAccessor (&NewQuicNode::GetDataSize,
                                         &NewQuicNode::SetDataSize),
                   MakeUintegerChecker<uint32_t> ())
    .AddAttribute ("StreamId",
                   "Identifier of the stream to be used in the QUIC connection",
                   UintegerValue (2),
                   MakeUintegerAccessor (&NewQuicNode::GetStreamId,
                                         &NewQuicNode::SetStreamId),
                   MakeUintegerChecker<uint32_t> ())
    .AddAttribute ("NumStreams",
                   "Number of streams to be used in the underlying QUIC socket",
                   UintegerValue (5),
                   MakeUintegerAccessor (&NewQuicNode::m_numStreams),
                   MakeUintegerChecker<uint32_t> (1,20))
    .AddTraceSource ("Tx", "A new packet is created and is sent",
                     MakeTraceSourceAccessor (&NewQuicNode::m_txTrace),
                     "ns3::Packet::TracedCallback")
  ;
  return tid;
}


NewQuicNode::NewQuicNode ()
{
  NS_LOG_FUNCTION (this);
  m_sent = 0;
  m_socket = 0;
  m_sendEvent = EventId ();
  m_data = 0;
  m_dataSize = 0;
  m_countSend = 0;
  m_countSendbyt = 0;
  m_receiveCount = 0;
  m_lastUsedStream = 1;
}

NewQuicNode::~NewQuicNode ()
{
  NS_LOG_FUNCTION (this);
  m_socket = 0;

  delete [] m_data;
  m_data = 0;
  m_dataSize = 0;
}

void
NewQuicNode::DoDispose (void)
{
  NS_LOG_FUNCTION (this);
  Application::DoDispose ();
}

void
NewQuicNode::StartApplication (void)
{
    NS_LOG_INFO ("########## New QUIC Node with address: "  << Ipv4Address::ConvertFrom(m_address) 
        << " START at time " << Simulator::Now ().GetSeconds () << " ##########");
    NS_LOG_FUNCTION (this);

    InitListenSocket();
    InitOutgoingConnection();

    Ptr<UniformRandomVariable> random = CreateObject<UniformRandomVariable> ();
    random->SetAttribute ("Min", DoubleValue(5));
    random->SetAttribute ("Max", DoubleValue(10));
    ScheduleTransmit (Seconds (random->GetValue()));
}

void
NewQuicNode::StopApplication ()
{
    NS_LOG_INFO ("##########  New QUIC Node with address: "  << Ipv4Address::ConvertFrom(m_address) 
        << " STOP at time " << Simulator::Now ().GetSeconds () << " ##########");
    NS_LOG_FUNCTION (this);

    if (m_socket != 0)
    {
        m_socket->Close ();
        m_socket->SetRecvCallback (MakeNullCallback<void, Ptr<Socket> > ());
        m_socket = 0;
    }

    for (auto peer : m_peers) {
        peer.second.socket->Close();
        peer.second.socket->SetRecvCallback (MakeNullCallback<void, Ptr<Socket> > ());
    }

    m_peers.clear();

    Simulator::Cancel (m_sendEvent);
}

void
NewQuicNode::InitListenSocket() 
{
    NS_LOG_INFO ("Initial Listen Socket......");
    NS_LOG_FUNCTION (this);

    if (m_socket == 0)
    {
        TypeId tid = TypeId::LookupByName ("ns3::QuicSocketFactory");
        InetSocketAddress local = InetSocketAddress(Ipv4Address::GetAny(), QUIC_PORT);

        m_socket = Socket::CreateSocket (GetNode (), tid);

        Ptr<QuicSocketBase> quic_socket = DynamicCast<QuicSocketBase> (m_socket);
        quic_socket->SetAttribute("InitialVersion", UintegerValue(QUIC_VERSION_NS3_IMPL));
        // quic_socket->SetAttribute("kDelayedAckTimeout", TimeValue(MilliSeconds(30)));
            
        if (m_socket->Bind (local) == -1)
        {
            NS_FATAL_ERROR ("Failed to bind socket");
        }

        m_socket->Listen();
        m_socket->SetRecvCallback (MakeCallback (&NewQuicNode::HandleRead, this));
        m_socket->SetAllowBroadcast (true);
    }
}

void
NewQuicNode::InitOutgoingConnection()
{
    for (auto k : m_knownAddresses) {
        TypeId tid = TypeId::LookupByName ("ns3::QuicSocketFactory");
        InetSocketAddress iAddr = ns3::InetSocketAddress(k, QUIC_PORT);
		    Ptr<Socket> socketPtr = Socket::CreateSocket (GetNode (), tid);
        Ptr<QuicSocketBase> quic_socket = DynamicCast<QuicSocketBase> (socketPtr);
        quic_socket->SetAttribute("InitialVersion", UintegerValue(QUIC_VERSION_NS3_IMPL));
        // quic_socket->SetAttribute("kDelayedAckTimeout", TimeValue(MilliSeconds(30)));
            
        if (socketPtr->Bind () == -1)
        {
            NS_FATAL_ERROR ("Failed to bind socket");
        }

        socketPtr->SetConnectCallback (
          ns3::MakeCallback (&NewQuicNode::HandleConnect, this),
          ns3::MakeNullCallback<void, Ptr<Socket>> ());
        socketPtr->Connect(iAddr);      
    }
}

void 
NewQuicNode::HandleConnect (ns3::Ptr<ns3::Socket> socketPtr)
{
    NS_LOG_FUNCTION(this);

    Address socketAddr;
	
    socketPtr->GetPeerName (socketAddr);

  	InetSocketAddress saddr = ns3::InetSocketAddress::ConvertFrom (socketAddr);
    Ipv4Address ipv4 = Ipv4Address::ConvertFrom(m_address);

	  if (ipv4 == saddr.GetIpv4() || m_peers.count(saddr.GetIpv4()) == 1) {
        NS_LOG_INFO("This node address: " << ipv4 << ", Outgoing connection CANCELED: " <<  saddr.GetIpv4()
        << " at time: " << Simulator::Now().GetSeconds());
		    socketPtr->Close ();
		    return;
	  }

    socketPtr->SetRecvCallback (ns3::MakeCallback (&NewQuicNode::HandleRead, this));

    NS_LOG_INFO("This node address: " << ipv4 << ", Outgoing connection ESTABLISHED: " <<  saddr.GetIpv4() << " at time: "
    << Simulator::Now().GetSeconds());
    
    QuicPeer p;
    p.socket = socketPtr;
    p.address = saddr.GetIpv4();
    m_peers[saddr.GetIpv4()] = p;
    NS_LOG_INFO("Connect peer and peer number: " << m_peers.size());
}

void
NewQuicNode::ScheduleTransmit (Time dt)
{
    NS_LOG_FUNCTION (this << dt);
    m_sendEvent = Simulator::Schedule (dt, &NewQuicNode::Send, this);
}

void
NewQuicNode::Send (void)
{
    NS_LOG_INFO ("##########  New QUIC Node with address: "  << Ipv4Address::ConvertFrom(m_address) 
        << " SENDING at time " << Simulator::Now ().GetSeconds () << " ##########");
    NS_LOG_FUNCTION (this);

    NS_ASSERT (m_sendEvent.IsExpired ());

    Ptr<Packet> p;
    if (m_dataSize)
    {
        NS_ASSERT_MSG (m_dataSize == m_size, "NewQuicNode::Send(): m_size and m_dataSize inconsistent");
        NS_ASSERT_MSG (m_data, "NewQuicNode::Send(): m_dataSize but no m_data");
        p = Create<Packet> (m_data, m_dataSize);
    }
    else
    {
        NS_LOG_INFO ("no data");
        p = Create<Packet> (m_size);
    }
    m_txTrace (p);

    // for (auto peer : m_peers) {
    //     NS_LOG_INFO("Send to node with address: " << peer.first);
    //     int sent = peer.second.socket->Send (p, 2);
    //     NS_ASSERT_MSG (sent - p->GetSize () == 0, "Could not send data (packet and sent size inconsistent)");
    // }

    // TypeId tid = TypeId::LookupByName ("ns3::QuicSocketFactory");
    // InetSocketAddress iAddr = ns3::InetSocketAddress(m_knownAddresses[m_sent % 2], QUIC_PORT);
		// Ptr<Socket> socketPtr = Socket::CreateSocket (GetNode (), tid);
    // Ptr<QuicSocketBase> quic_socket = DynamicCast<QuicSocketBase> (socketPtr);
    // quic_socket->SetAttribute("InitialVersion", UintegerValue(QUIC_VERSION_NS3_IMPL));
            
    // if (socketPtr->Bind () == -1)
    // {
    //     NS_FATAL_ERROR ("Failed to bind socket");
    //  }

    // socketPtr->Connect(iAddr);
    // NS_LOG_INFO("Send to node with address: " << m_knownAddresses[m_sent % 2]);
    // int sent = socketPtr->Send (p, 1);
    // NS_ASSERT_MSG (sent - p->GetSize () == 0, "Could not send data (packet and sent size inconsistent)"); 
    NS_LOG_INFO("Send to node with address: " << m_peers[m_knownAddresses[m_sent % 2]].address);
    int sent = m_peers[m_knownAddresses[m_sent % 2]].socket->Send (p, 1);
    NS_ASSERT_MSG (sent - p->GetSize () == 0, "Could not send data (packet and sent size inconsistent)");

    m_lastUsedStream++;
    if (m_lastUsedStream > m_numStreams) {
        m_lastUsedStream = 1;
    }

    m_sent++;

    if ((uint32_t) m_sent / 2 < m_count)
    {   
        Ptr<UniformRandomVariable> random = CreateObject<UniformRandomVariable> ();
        random->SetAttribute ("Min", DoubleValue(1));
        random->SetAttribute ("Max", DoubleValue(2));
        ScheduleTransmit (Seconds(random->GetValue()));
    }
}

void
NewQuicNode::HandleRead (Ptr<Socket> socket)
{
    NS_LOG_INFO ("##########  New QUIC Node with address: "  << Ipv4Address::ConvertFrom(m_address) 
        << " RECEIVING at time " << Simulator::Now ().GetSeconds () << " ##########");
    NS_LOG_FUNCTION (this);

    Ptr<Packet> packet;
    Address from;
    while ((packet = socket->RecvFrom (from)))
    {
        packet->RemoveAllByteTags ();
        packet->RemoveAllPacketTags ();

        if (InetSocketAddress::IsMatchingType (from))
        {
          NS_LOG_INFO ("At time " << Simulator::Now ().GetSeconds () << "s client received " << packet->GetSize () << " bytes from " <<
                       InetSocketAddress::ConvertFrom (from).GetIpv4 () << " port " <<
                       InetSocketAddress::ConvertFrom (from).GetPort ());
        }
        else if (Inet6SocketAddress::IsMatchingType (from))
        {
          NS_LOG_INFO ("At time " << Simulator::Now ().GetSeconds () << "s client received " << packet->GetSize () << " bytes from " <<
                       Inet6SocketAddress::ConvertFrom (from).GetIpv6 () << " port " <<
                       Inet6SocketAddress::ConvertFrom (from).GetPort ());
        }

        uint8_t *buffer = new uint8_t[packet->GetSize ()];
        packet->CopyData (buffer, packet->GetSize ());
         std::string s = std::string ((char*)buffer);
        NS_LOG_INFO ("Client received: " << s << "");
    }

    m_receiveCount += 1;
}

void
NewQuicNode::SetKnownAddresses (const std::vector<Ipv4Address> &knownAddresses)
{
    NS_LOG_FUNCTION(this);
    m_knownAddresses = knownAddresses;
}

void
NewQuicNode::SetDataSize (uint32_t dataSize)
{
  NS_LOG_FUNCTION (this << dataSize);

  //
  // If the client is setting the echo packet data size this way, we infer
  // that she doesn't care about the contents of the packet at all, so
  // neither will we.
  //
  delete [] m_data;
  m_data = 0;
  m_dataSize = 0;
  m_size = dataSize;
}

uint32_t
NewQuicNode::GetDataSize (void) const
{
  NS_LOG_FUNCTION (this);
  return m_size;
}

void
NewQuicNode::SetFill (std::string fill)
{
  NS_LOG_FUNCTION (this << fill);

  uint32_t dataSize = fill.size () + 1;

  if (dataSize != m_dataSize)
    {
      delete [] m_data;
      m_data = new uint8_t [dataSize];
      m_dataSize = dataSize;
    }

  memcpy (m_data, fill.c_str (), dataSize);

  //
  // Overwrite packet size attribute.
  //
  m_size = dataSize;
}

void
NewQuicNode::ScheduleClosing (Time dt)
{
  NS_LOG_FUNCTION (this << dt);
  m_closeEvent = Simulator::Schedule (dt, &NewQuicNode::Close, this);
}

void
NewQuicNode::Close (void)
{
    NS_LOG_INFO ("##########  QUIC Echo Client New QUIC Node with address: "  << Ipv4Address::ConvertFrom(m_address) 
        << " CLOSING at time " << Simulator::Now ().GetSeconds () << " ##########");
    NS_LOG_FUNCTION (this);
    NS_ASSERT (m_closeEvent.IsExpired ());

    m_socket->Close ();

    for (auto peer : m_peers) {
        peer.second.socket->Close();
        peer.second.socket->SetRecvCallback (MakeNullCallback<void, Ptr<Socket> > ());
    }

    m_peers.clear();
}


void
NewQuicNode::SetStreamId (uint32_t streamId)
{
  NS_LOG_FUNCTION (this << streamId);
  NS_ABORT_MSG_IF (streamId == 0, "Stream 0 cannot be used for application data");

  m_lastUsedStream = streamId;
}

uint32_t
NewQuicNode::GetStreamId (void) const
{
  return m_lastUsedStream;
}

uint32_t
NewQuicNode::GetReceiveCount(void) const
{
    return m_receiveCount;
}

} // Namespace ns3

3. com-quic-tester.cc

#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/quic-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/point-to-point-layout-module.h"
#include "ns3/applications-module.h"
#include "ns3/config-store-module.h"
#include "ns3/packet.h"
#include "ns3/node-container.h"


#include "new-quic-node.h"
#include <iostream>

using namespace ns3;

NS_LOG_COMPONENT_DEFINE("ComQuicTester");

static uint32_t totalSize = 0;
static void ReceivedPacket(Ptr<const Packet> packet);

int
main (int argc, char *argv[]) {
    LogComponentEnableAll (LOG_PREFIX_TIME);
    LogComponentEnableAll (LOG_PREFIX_FUNC);
    LogComponentEnableAll (LOG_PREFIX_NODE);
    LogComponentEnable("NewQuicNode", LOG_LEVEL_INFO);
    LogComponentEnable("ComQuicTester", LOG_LEVEL_INFO);
    LogComponentEnable("QuicSocketBase", LOG_LEVEL_INFO);
    LogComponentEnable("QuicStreamTxBuffer", LOG_LEVEL_INFO);
    LogComponentEnable("QuicSocketTxBuffer", LOG_LEVEL_INFO);

    // RngSeedManager::SetSeed(1);
    uint32_t nNodes = 3;

    // Config::SetDefault("ns3::QuicL4Protocol::0RTT-Handshake", BooleanValue(true));


    ApplicationContainer apps;

    PointToPointHelper pointToPoint;
    pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("100Mbps"));
    pointToPoint.SetDeviceAttribute ("Mtu", UintegerValue (1500));
    pointToPoint.SetChannelAttribute ("Delay", StringValue ("12ms"));

    // QueueSize qs ("100MB");
    // pointToPoint.SetQueue("ns3::DropTailQueue",  "MaxSize", QueueSizeValue(qs));

    PointToPointStarHelper star (nNodes, pointToPoint);
    NodeContainer nodes;

    for (uint32_t i = 0; i < nNodes; i++) {
        nodes.Add(star.GetSpokeNode(i));
    }

    nodes.Add(star.GetHub());

    QuicHelper stack;
    stack.InstallQuic(nodes);

    star.AssignIpv4Addresses (ns3::Ipv4AddressHelper ("10.0.0.0", "255.255.255.0"));
    for (uint32_t i = 0; i < nNodes; i++) {
        Ptr<Node> spokeNode = star.GetSpokeNode(i);
        // NS_LOG_INFO("Net Device Number: " << spokeNode->GetNDevices());
        // NS_LOG_INFO("Address: " << spokeNode->GetDevice(0)->GetAddress());
        // NS_LOG_INFO("Address: " << spokeNode->GetDevice(1)->GetAddress());
        Ptr<PointToPointNetDevice> dev = DynamicCast<PointToPointNetDevice> (spokeNode->GetDevice(0));
        // Ptr<LoopbackNetDevice> dev1 = DynamicCast<LoopbackNetDevice> (spokeNode->GetDevice(1));
        // NS_LOG_INFO(dev->GetTypeId());
        // NS_LOG_INFO(dev1->GetTypeId());
        dev->TraceConnectWithoutContext("MacTx", MakeCallback(&ReceivedPacket));
    }

    ns3::Ipv4GlobalRoutingHelper::PopulateRoutingTables ();

    for (uint32_t i = 0; i < nNodes; i++) {
        Ptr<NewQuicNode> app;
        app = CreateObject<NewQuicNode>();
        app->SetAttribute("SelfAddress", AddressValue(star.GetSpokeIpv4Address(i)));
        app->SetFill("Hello World!");
        
        std::vector<Ipv4Address> new_peers;
        
        for (uint32_t j = 0; j < nNodes; j++) {
            if (j != i) {
                new_peers.push_back(star.GetSpokeIpv4Address(j));
            }
        }
        
        app->SetKnownAddresses(new_peers);
        app->SetStartTime(Seconds(1.0));
        star.GetSpokeNode(i)->AddApplication(app);
        apps.Add(app);
    }

    NS_LOG_INFO("Running Simulator!");
    Simulator::Stop (Seconds(13.0));
    Simulator::Run ();

    Simulator::Destroy ();
    for (uint32_t i = 0; i < nNodes; i++) {
        Ptr<NewQuicNode> comQuicNode = DynamicCast<NewQuicNode>(apps.Get(i));
        NS_LOG_INFO("Node " << i << " has received packet count: " << comQuicNode->GetReceiveCount());
    }

    NS_LOG_INFO ("Total receive size: " << totalSize);
    NS_LOG_INFO ("Simulation finished!");
    return 0;
}

static void ReceivedPacket(ns3::Ptr<const ns3::Packet> packet) 
{
    totalSize += packet->GetSize();
    // NS_LOG_INFO("Receive packet with size" << packet->GetSize());
}

Question 1: Infinite retransmission
I've constructed a star-shaped P2P network topology consisting of 3 nodes, where each node transmits to the other two nodes. Whenever I set the channel latency to exceed 13ms, I encounter infinite retransmission issues, and I'm unsure why this problem occurs.

Question 2:Inability to receive data packets in 0-RTT mode
When I enable 0-RTT mode

Config::SetDefault("ns3::QuicL4Protocol::0RTT-Handshake", BooleanValue(true));

If I establish the connection using the following method

    for (auto k : m_knownAddresses) {
        TypeId tid = TypeId::LookupByName ("ns3::QuicSocketFactory");
        InetSocketAddress iAddr = ns3::InetSocketAddress(k, QUIC_PORT);
		    Ptr<Socket> socketPtr = Socket::CreateSocket (GetNode (), tid);
        Ptr<QuicSocketBase> quic_socket = DynamicCast<QuicSocketBase> (socketPtr);
        quic_socket->SetAttribute("InitialVersion", UintegerValue(QUIC_VERSION_NS3_IMPL));
        // quic_socket->SetAttribute("kDelayedAckTimeout", TimeValue(MilliSeconds(30)));
            
        if (socketPtr->Bind () == -1)
        {
            NS_FATAL_ERROR ("Failed to bind socket");
        }

        socketPtr->SetConnectCallback (
          ns3::MakeCallback (&NewQuicNode::HandleConnect, this),
          ns3::MakeNullCallback<void, Ptr<Socket>> ());
        socketPtr->Connect(iAddr);      
    }

In that case, the other nodes are unable to receive any data packets. Through the logs, I've discovered that it seems to be because the 'availWin' is constantly 0. I haven't found a solution to this problem

If I establish the connection just before sending the data packets, then the data packets can be successfully sent. However, using this approach may consume a large amount of memory and lead to program termination, especially in scenarios with multiple nodes or when sending multiple data packets.

    TypeId tid = TypeId::LookupByName ("ns3::QuicSocketFactory");
    InetSocketAddress iAddr = ns3::InetSocketAddress(m_knownAddresses[m_sent % 2], QUIC_PORT);
    Ptr<Socket> socketPtr = Socket::CreateSocket (GetNode (), tid);
    Ptr<QuicSocketBase> quic_socket = DynamicCast<QuicSocketBase> (socketPtr);
    quic_socket->SetAttribute("InitialVersion", UintegerValue(QUIC_VERSION_NS3_IMPL));
            
    if (socketPtr->Bind () == -1)
    {
         NS_FATAL_ERROR ("Failed to bind socket");
    }

    socketPtr->Connect(iAddr);
    NS_LOG_INFO("Send to node with address: " << m_knownAddresses[m_sent % 2]);
    int sent = socketPtr->Send (p, 1);
    NS_ASSERT_MSG (sent - p->GetSize () == 0, "Could not send data (packet and sent size inconsistent)"); 

I hope to receive your response and assistance!

The build issue

Every time a modified file is recompiled, it always needs to recompile files after 2000. For example, I will add a statement "std::cout << "Test." << std::endl;" in quic-variants-comparision
And run "./waf --run scratch/ quic-variants-comparision ". The results are as follows:
Waf: Entering directory `/home/czy/ns-3-dev/build'
[ 1/2947] Compiling install-ns3-header: ns3/windowed-filter.h
[1219/2947] Compiling src/internet/model/tcp-bbr.cc
[1926/2947] Compiling src/quic/model/quic-bbr.cc
[2386/2947] Compiling src/internet/test/tcp-bbr-test.cc
[2387/2947] Linking build/lib/libns3-dev-internet-debug.so
[2408/2947] Compiling src/fd-net-device/helper/tap-fd-net-device-helper.cc
[2409/2947] Compiling src/internet/test/tcp-endpoint-bug2211.cc
[2411/2947] Compiling src/internet/test/tcp-syn-connection-failed-test.cc
[2412/2947] Compiling src/lte/test/test-lte-x2-handover-measures.cc
[2413/2947] Linking build/lib/libns3-dev-applications-debug.so
[2414/2947] Linking build/lib/libns3-dev-internet-apps-debug.so
[2415/2947] Linking build/lib/libns3-dev-point-to-point-layout-debug.so
[2416/2947] Linking build/lib/libns3-dev-lte-debug.so
[2417/2947] Linking build/lib/libns3-dev-flow-monitor-debug.so
[2418/2947] Linking build/lib/libns3-dev-wave-debug.so
[2419/2947] Linking build/lib/libns3-dev-wimax-debug.so
[2420/2947] Linking build/lib/libns3-dev-olsr-debug.so
[2421/2947] Linking build/lib/libns3-dev-sixlowpan-debug.so
[2422/2947] Linking build/lib/libns3-dev-dsr-debug.so
[2423/2947] Linking build/lib/libns3-dev-mesh-debug.so
[2424/2947] Linking build/lib/libns3-dev-csma-layout-debug.so
[2425/2947] Linking build/lib/libns3-dev-netanim-debug.so
[2426/2947] Linking build/lib/libns3-dev-nix-vector-routing-debug.so
[2427/2947] Linking build/lib/libns3-dev-aodv-debug.so
[2428/2947] Linking build/lib/libns3-dev-dsdv-debug.so
[2429/2947] Linking build/lib/libns3-dev-quic-debug.so
[2430/2947] Linking build/lib/libns3-dev-tap-bridge-debug.so
[2431/2947] Linking build/lib/libns3-dev-test-debug.so
[2432/2947] Linking build/lib/libns3-dev-aodv-test-debug.so
[2433/2947] Linking build/lib/libns3-dev-applications-test-debug.so
[2434/2947] Linking build/lib/libns3-dev-dsdv-test-debug.so
[2435/2947] Linking build/lib/libns3-dev-dsr-test-debug.so
[2436/2947] Linking build/lib/libns3-dev-flow-monitor-test-debug.so
[2437/2947] Linking build/lib/libns3-dev-internet-test-debug.so
[2438/2947] Linking build/lib/libns3-dev-internet-apps-test-debug.so
[2439/2947] Linking build/lib/libns3-dev-mesh-test-debug.so
[2440/2947] Linking build/lib/libns3-dev-nix-vector-routing-test-debug.so
[2441/2947] Linking build/lib/libns3-dev-olsr-test-debug.so
[2442/2947] Linking build/lib/libns3-dev-sixlowpan-test-debug.so
[2443/2947] Linking build/lib/libns3-dev-wave-test-debug.so
[2444/2947] Linking build/lib/libns3-dev-wimax-test-debug.so
[2446/2947] Linking build/src/core/examples/ns3-dev-empirical-random-variable-example-debug
[2447/2947] Compiling src/lte/test/lte-test-radio-link-failure.cc
[2451/2947] Compiling src/lte/test/lte-test-ipv6-routing.cc
[2452/2947] Compiling src/lte/test/lte-test-pss-ff-mac-scheduler.cc
[2455/2947] Linking build/lib/libns3-dev-quic-test-debug.so
[2457/2947] Compiling src/lte/test/lte-test-deactivate-bearer.cc
[2458/2947] Compiling src/lte/test/test-lte-x2-handover.cc
[2464/2947] Compiling src/lte/test/lte-test-frequency-reuse.cc
[2465/2947] Compiling src/lte/test/lte-test-fdtbfq-ff-mac-scheduler.cc
[2466/2947] Compiling src/lte/test/lte-test-tdtbfq-ff-mac-scheduler.cc
[2467/2947] Compiling src/lte/test/lte-test-cqa-ff-mac-scheduler.cc
[2468/2947] Compiling src/netanim/test/netanim-test.cc
[2469/2947] Compiling src/test/traced/traced-callback-typedef-test-suite.cc
[2470/2947] Linking build/src/wave/examples/ns3-dev-wave-simple-80211p-debug
[2471/2947] Linking build/lib/libns3-dev-lte-test-debug.so
[2472/2947] Linking build/lib/libns3-dev-netanim-test-debug.so
[2473/2947] Linking build/src/wave/examples/ns3-dev-wave-simple-device-debug
[2474/2947] Linking build/src/wifi/examples/ns3-dev-wifi-bianchi-debug
[2475/2947] Linking build/examples/ipv6/ns3-dev-test-ipv6-debug
[2476/2947] Linking build/examples/routing/ns3-dev-simple-multicast-flooding-debug
[2477/2947] Linking build/examples/wireless/ns3-dev-mixed-wired-wireless-debug
[2478/2947] Linking build/examples/wireless/ns3-dev-wifi-adhoc-debug
[2483/2947] Linking build/examples/wireless/ns3-dev-wifi-clear-channel-cmu-debug
[2484/2947] Linking build/examples/wireless/ns3-dev-wifi-ap-debug
[2485/2947] Linking build/examples/wireless/ns3-dev-wifi-wired-bridging-debug
[2486/2947] Linking build/examples/wireless/ns3-dev-wifi-multirate-debug
[2487/2947] Linking build/examples/wireless/ns3-dev-wifi-simple-adhoc-debug
[2488/2947] Linking build/examples/wireless/ns3-dev-wifi-simple-adhoc-grid-debug
[2489/2947] Linking build/examples/wireless/ns3-dev-wifi-simple-infra-debug
[2490/2947] Linking build/examples/wireless/ns3-dev-wifi-simple-interference-debug
[2491/2947] Linking build/examples/wireless/ns3-dev-wifi-blockack-debug
[2492/2947] Linking build/examples/wireless/ns3-dev-wifi-hidden-terminal-debug
[2493/2947] Linking build/examples/wireless/ns3-dev-wifi-ht-network-debug
[2494/2947] Linking build/examples/wireless/ns3-dev-wifi-vht-network-debug
[2495/2947] Linking build/examples/wireless/ns3-dev-wifi-timing-attributes-debug
[2496/2947] Linking build/examples/wireless/ns3-dev-wifi-sleep-debug
[2497/2947] Linking build/lib/libns3-dev-test-test-debug.so
[2498/2947] Linking build/examples/wireless/ns3-dev-wifi-power-adaptation-distance-debug
[2499/2947] Linking build/examples/wireless/ns3-dev-wifi-power-adaptation-interference-debug
[2500/2947] Linking build/examples/wireless/ns3-dev-wifi-rate-adaptation-distance-debug
[2501/2947] Linking build/examples/wireless/ns3-dev-wifi-aggregation-debug
[2502/2947] Linking build/examples/wireless/ns3-dev-wifi-txop-aggregation-debug
[2504/2947] Linking build/examples/wireless/ns3-dev-wifi-simple-ht-hidden-stations-debug
[2505/2947] Linking build/examples/wireless/ns3-dev-wifi-80211n-mimo-debug
[2506/2947] Linking build/examples/wireless/ns3-dev-wifi-mixed-network-debug
[2508/2947] Linking build/examples/wireless/ns3-dev-wifi-tcp-debug
[2509/2947] Linking build/examples/wireless/ns3-dev-wifi-80211e-txop-debug
[2510/2947] Linking build/examples/wireless/ns3-dev-wifi-spectrum-per-example-debug
[2511/2947] Linking build/examples/wireless/ns3-dev-wifi-spectrum-per-interference-debug
[2512/2947] Linking build/examples/wireless/ns3-dev-wifi-spectrum-saturation-example-debug
[2513/2947] Linking build/examples/wireless/ns3-dev-wifi-he-network-debug
[2514/2947] Linking build/examples/wireless/ns3-dev-wifi-multi-tos-debug
[2535/2947] Linking build/examples/wireless/ns3-dev-wifi-backward-compatibility-debug
[2536/2947] Linking build/examples/wireless/ns3-dev-wifi-spatial-reuse-debug
[2538/2947] Linking build/utils/ns3-dev-test-runner-debug
[2539/2947] Linking build/src/csma/examples/ns3-dev-csma-packet-socket-debug
[2540/2947] Linking build/utils/ns3-dev-print-introspected-doxygen-debug
[2541/2947] Compiling src/aodv/examples/aodv.cc
[2542/2947] Compiling src/applications/examples/three-gpp-http-example.cc
[2543/2947] Compiling src/bridge/examples/csma-bridge.cc
[2544/2947] Compiling src/bridge/examples/csma-bridge-one-hop.cc
[2545/2947] Linking build/src/applications/examples/ns3-dev-three-gpp-http-example-debug
[2546/2947] Linking build/src/aodv/examples/ns3-dev-aodv-debug
[2547/2947] Linking build/src/bridge/examples/ns3-dev-csma-bridge-debug
[2548/2947] Linking build/src/bridge/examples/ns3-dev-csma-bridge-one-hop-debug
[2549/2947] Compiling src/csma/examples/csma-one-subnet.cc
[2550/2947] Compiling src/csma/examples/csma-broadcast.cc
[2551/2947] Compiling src/csma/examples/csma-multicast.cc
[2552/2947] Linking build/src/csma/examples/ns3-dev-csma-one-subnet-debug
[2553/2947] Linking build/src/csma/examples/ns3-dev-csma-broadcast-debug
[2554/2947] Compiling src/csma/examples/csma-raw-ip-socket.cc
[2555/2947] Compiling src/csma/examples/csma-ping.cc
[2556/2947] Linking build/src/csma/examples/ns3-dev-csma-multicast-debug
[2557/2947] Linking build/src/csma/examples/ns3-dev-csma-raw-ip-socket-debug
[2558/2947] Compiling src/csma-layout/examples/csma-star.cc
[2559/2947] Compiling src/dsdv/examples/dsdv-manet.cc
[2560/2947] Linking build/src/csma/examples/ns3-dev-csma-ping-debug
[2561/2947] Linking build/src/csma-layout/examples/ns3-dev-csma-star-debug
[2562/2947] Compiling src/dsr/examples/dsr.cc
[2563/2947] Compiling src/fd-net-device/examples/dummy-network.cc
[2564/2947] Linking build/src/dsdv/examples/ns3-dev-dsdv-manet-debug
[2565/2947] Compiling src/fd-net-device/examples/fd2fd-onoff.cc
[2566/2947] Linking build/src/dsr/examples/ns3-dev-dsr-debug
[2567/2947] Linking build/src/fd-net-device/examples/ns3-dev-dummy-network-debug
[2568/2947] Compiling src/fd-net-device/examples/realtime-dummy-network.cc
[2569/2947] Compiling src/fd-net-device/examples/realtime-fd2fd-onoff.cc
[2570/2947] Linking build/src/fd-net-device/examples/ns3-dev-fd2fd-onoff-debug
[2571/2947] Compiling src/fd-net-device/examples/fd-emu-ping.cc
[2572/2947] Linking build/src/fd-net-device/examples/ns3-dev-realtime-dummy-network-debug
[2573/2947] Linking build/src/fd-net-device/examples/ns3-dev-realtime-fd2fd-onoff-debug
[2574/2947] Compiling src/fd-net-device/examples/fd-emu-onoff.cc
[2582/2947] Compiling src/fd-net-device/examples/fd-emu-tc.cc
[2583/2947] Linking build/src/lte/examples/ns3-dev-lena-cqi-threshold-debug
[2584/2947] Linking build/src/fd-net-device/examples/ns3-dev-fd-emu-ping-debug
[2585/2947] Linking build/src/fd-net-device/examples/ns3-dev-fd-emu-onoff-debug
[2586/2947] Compiling src/fd-net-device/examples/fd-emu-send.cc
[2588/2947] Linking build/src/fd-net-device/examples/ns3-dev-fd-emu-tc-debug
[2590/2947] Linking build/src/lte/examples/ns3-dev-lena-fading-debug
[2591/2947] Linking build/src/lte/examples/ns3-dev-lena-intercell-interference-debug
[2592/2947] Compiling src/fd-net-device/examples/fd-emu-udp-echo.cc
[2593/2947] Compiling src/fd-net-device/examples/fd-tap-ping.cc
[2594/2947] Compiling src/fd-net-device/examples/fd-tap-ping6.cc
[2595/2947] Linking build/src/fd-net-device/examples/ns3-dev-fd-emu-send-debug
[2596/2947] Linking build/src/fd-net-device/examples/ns3-dev-fd-emu-udp-echo-debug
[2599/2947] Linking build/src/fd-net-device/examples/ns3-dev-fd-tap-ping-debug
[2600/2947] Linking build/src/lte/examples/ns3-dev-lena-pathloss-traces-debug
[2601/2947] Linking build/src/lte/examples/ns3-dev-lena-profiling-debug
[2604/2947] Linking build/src/fd-net-device/examples/ns3-dev-fd-tap-ping6-debug
[2605/2947] Linking build/src/lte/examples/ns3-dev-lena-rem-debug
[2608/2947] Linking build/src/lte/examples/ns3-dev-lena-rem-sector-antenna-debug
[2609/2947] Linking build/src/lte/examples/ns3-dev-lena-rlc-traces-debug
[2610/2947] Linking build/src/lte/examples/ns3-dev-lena-simple-debug
[2611/2947] Compiling src/internet/examples/main-simple.cc
[2612/2947] Compiling src/internet-apps/examples/dhcp-example.cc
[2613/2947] Compiling src/internet-apps/examples/traceroute-example.cc
[2614/2947] Linking build/src/internet/examples/ns3-dev-main-simple-debug
[2615/2947] Linking build/src/internet-apps/examples/ns3-dev-dhcp-example-debug
[2617/2947] Compiling src/lte/examples/lena-dual-stripe.cc
[2618/2947] Linking build/src/lte/examples/ns3-dev-lena-frequency-reuse-debug
[2619/2947] Compiling src/lte/examples/lena-ipv6-addr-conf.cc
[2620/2947] Linking build/src/internet-apps/examples/ns3-dev-traceroute-example-debug
[2622/2947] Linking build/src/lte/examples/ns3-dev-lena-dual-stripe-debug
[2623/2947] Linking build/src/lte/examples/ns3-dev-lena-uplink-power-control-debug
[2624/2947] Compiling src/lte/examples/lena-ipv6-ue-rh.cc
[2625/2947] Compiling src/lte/examples/lena-ipv6-ue-ue.cc
[2626/2947] Linking build/src/lte/examples/ns3-dev-lena-ipv6-addr-conf-debug
[2627/2947] Compiling src/lte/examples/lena-simple-epc.cc
[2628/2947] Linking build/src/lte/examples/ns3-dev-lena-ipv6-ue-rh-debug
[2629/2947] Compiling src/lte/examples/lena-simple-epc-backhaul.cc
[2644/2947] Linking build/src/lte/examples/ns3-dev-lena-ipv6-ue-ue-debug
[2645/2947] Linking build/src/lte/examples/ns3-dev-lena-simple-epc-debug
[2646/2947] Compiling src/lte/examples/lena-deactivate-bearer.cc
[2647/2947] Compiling src/lte/examples/lena-x2-handover.cc
[2648/2947] Compiling src/lte/examples/lena-x2-handover-measures.cc
[2649/2947] Linking build/src/lte/examples/ns3-dev-lena-simple-epc-backhaul-debug
[2650/2947] Linking build/src/lte/examples/ns3-dev-lena-deactivate-bearer-debug
[2651/2947] Linking build/src/lte/examples/ns3-dev-lena-x2-handover-debug
[2653/2947] Compiling src/lte/examples/lena-distributed-ffr.cc
[2654/2947] Linking build/src/netanim/examples/ns3-dev-uan-animation-debug
[2655/2947] Linking build/src/lte/examples/ns3-dev-lena-x2-handover-measures-debug
[2656/2947] Compiling src/lte/examples/lena-radio-link-failure.cc
[2659/2947] Compiling src/lte/examples/lena-simple-epc-emu.cc
[2660/2947] Linking build/src/lte/examples/ns3-dev-lena-distributed-ffr-debug
[2661/2947] Linking build/src/lte/examples/ns3-dev-lena-radio-link-failure-debug
[2662/2947] Linking build/src/lte/examples/ns3-dev-lena-simple-epc-emu-debug
[2663/2947] Compiling src/mesh/examples/mesh.cc
[2664/2947] Compiling src/netanim/examples/dumbbell-animation.cc
....
I would like to know how to set it so that it does not compile some irrelevant file at a time. I look forward to your guidance. Thank you very much.

Quic Erro

Please anyone help me? When I used my own code using udp its work fine. But when I use QUIC instead of UDP then they show me errors that ".......... not found".

I have just clone the full repo and then configure and build. To that point its fine and also build successfully. And also work when I use UDP but when I used to change UDP with QUIC then its not run but shows some errors.

Anyone who can help me in this??

Thanks

QUIC integration

How can we use QUIC instead of a UDP..? Anyone have any idea ?

SIGABRT "0RTT Handshake requested with wrong Initial Version" -- even when not enabling 0RTT explicitly.

Without enabling QUIC_VERSION_DRAFT_10, ns-3 crashes for me with

aborted. cond="!IsVersionSupported (m_vers)", msg="0RTT Handshake requested with wrong Initial Version", +4.713833601s 157 file=../../contrib/quic/model/quic-socket-base.cc, line=2550
libc++abi.dylib: terminating
Process 12686 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
    frame #0: 0x00007fff693ef33a libsystem_kernel.dylib`__pthread_kill + 10
libsystem_kernel.dylib`__pthread_kill:
->  0x7fff693ef33a <+10>: jae    0x7fff693ef344            ; <+20>
    0x7fff693ef33c <+12>: movq   %rax, %rdi
    0x7fff693ef33f <+15>: jmp    0x7fff693e9629            ; cerror_nocancel
    0x7fff693ef344 <+20>: retq
Target 0: (bns) stopped.

This happens even if I do not explicitly enable the 0RTT handshakes.
It also seems that this is not caused by an explicit call to Connect, but possibly due to a reconnect of an aborted connection?

Please find attached a full backtrace of the crash.

SIGABRT: Whole simulation aborted after full RX buffer.

I'm running into an issue where for some reason a stream RX buffer is filled up. While I have to figure out the reason for this on my side, it currently results in the whole simulation being aborted, due to https://github.com/signetlabdei/quic/blob/master/model/quic-stream-base.cc#L490.

I'm not sure that this is the intended behavior. Especially for larger simulations where the transport protocol is only one piece fo the puzzle, the entire simulation should likely not crash if a single buffer is full.

Please find attached the corresponding backtrace.

Limited bytes are sent only when using BulkSend app with QuicSocket

Hi,
I am trying to send 2GB bytes with BulkSend app using QuicSocket however the app stops sending data after sending a few hundred thousand bytes (approx 14600 Quic packets). Is there any issue with the Quic implementation or it's me doing something wrong?
I used the code from quic-variants-comparison-bulksend.cc

Thank you

uint16_t port = 50000; // well-known echo port number

Address sinkLocalAddress (InetSocketAddress (Ipv4Address::GetAny (), port));

ApplicationContainer clientApps;
ApplicationContainer serverApps;
// applications client and server

  AddressValue remoteAddress (InetSocketAddress (interfaces.GetAddress (1), port));
  BulkSendHelper ftp ("ns3::QuicSocketFactory", Address ());
  ftp.SetAttribute ("Remote", remoteAddress);
  ftp.SetAttribute ("SendSize", UintegerValue (1400));
  ftp.SetAttribute ("MaxBytes", UintegerValue (10000000));   // = 2147483648;     //2GB file
  clientApps.Add(ftp.Install (terminals.Get (0)));
  PacketSinkHelper sinkHelper ("ns3::QuicSocketFactory", sinkLocalAddress);
  sinkHelper.SetAttribute ("Protocol", TypeIdValue (QuicSocketFactory::GetTypeId ()));
  serverApps.Add(sinkHelper.Install (terminals.Get (1)));

serverApps.Start (Seconds (1.0));
clientApps.Stop (Seconds (50.0));
clientApps.Start (Seconds (4.0));

Show error

I write this code as follow but they give me error while run it. Anyone can help me out in this;

#include
#include "ns3/core-module.h"
#include "ns3/csma-module.h"
#include "ns3/applications-module.h"
#include "ns3/internet-module.h"
#include "ns3/quic-module.h"
//#include "ns3/quic-echo-client-helper.h"
//#include "ns3/quic-echo-server-helper.h"

using namespace ns3;

NS_LOG_COMPONENT_DEFINE ("RealtimeUdpEchoExample");

int
main (int argc, char *argv[])
{
//
// Allow the user to override any of the defaults and the above Bind() at
// run-time, via command-line arguments
//
CommandLine cmd;
cmd.Parse (argc, argv);

//
// But since this is a realtime script, don't allow the user to mess with
// that.
//
GlobalValue::Bind ("SimulatorImplementationType",
StringValue ("ns3::RealtimeSimulatorImpl"));

//
// Explicitly create the nodes required by the topology (shown above).
//
NS_LOG_INFO ("Create nodes.");
NodeContainer n;
n.Create (4);

InternetStackHelper internet;
internet.Install (n);

//
// Explicitly create the channels required by the topology (shown above).
//
NS_LOG_INFO ("Create channels.");
CsmaHelper csma;
csma.SetChannelAttribute ("DataRate", DataRateValue (DataRate (5000000)));
csma.SetChannelAttribute ("Delay", TimeValue (MilliSeconds (2)));
csma.SetDeviceAttribute ("Mtu", UintegerValue (1400));
NetDeviceContainer d = csma.Install (n);

//
// We've got the "hardware" in place. Now we need to add IP addresses.
//
NS_LOG_INFO ("Assign IP Addresses.");
Ipv4AddressHelper ipv4;
ipv4.SetBase ("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer i = ipv4.Assign (d);

NS_LOG_INFO ("Create Applications.");

//
// Create a UdpEchoServer application on node one.
//
uint16_t port = 9; // well-known echo port number
QuicEchoServerHelper quicServer (port);
ApplicationContainer apps = server.Install (n.Get (1));
apps.Start (Seconds (1.0));
apps.Stop (Seconds (10.0));

//
// Create a UdpEchoClient application to send UDP datagrams from node zero to
// node one.
//
uint32_t packetSize = 1024;
uint32_t maxPacketCount = 500;
Time interPacketInterval = Seconds (0.01);
QuicEchoClientHelper quicClient (i.GetAddress (1), port);
quicclient.SetAttribute ("MaxPackets", UintegerValue (maxPacketCount));
quicclient.SetAttribute ("Interval", TimeValue (interPacketInterval));
quicclient.SetAttribute ("PacketSize", UintegerValue (packetSize));
apps = quicclient.Install (n.Get (0));
apps.Start (Seconds (2.0));
apps.Stop (Seconds (10.0));

AsciiTraceHelper ascii;
csma.EnableAsciiAll (ascii.CreateFileStream ("realtime-udp-echo.tr"));
csma.EnablePcapAll ("realtime-udp-echo", false);

//
// Now, do the actual simulation.
//
Simulator::Stop (Seconds (11.0));
NS_LOG_INFO ("Run Simulation.");
Simulator::Run ();
Simulator::Destroy ();
NS_LOG_INFO ("Done.");
}

image

Unable to establish two QUIC connection on the same receiver

Hi,

I'm trying to establish two QUIC connections, both from node0 to node1, but I'm countering an error.
I tried to investigate why is that happening. After adding the following prints in the QUIC module (quic-socket-base.cc file):
quic-socket-base.cc edit

I got the following result:
Two different sockets use the same QuicL4Protocol object

From the results I got, I can see that two different QuicSocketBase objects are using the same QuicL4Protocol object.
Is this by design? I think this is something worth reviewing, hopefully it would resolve the error.

In case it is needed, this is the full simulation I'm trying to run: https://github.com/muhammadeid172/QUIC-vs-TCP-A-Performance-Evaluation-over-LTE-with-NS-3/blob/main/FailedAttempts/TwoQuicConnectionsSameReceiver.cc

Thanks! :)

[Help Wanted]: Unable to build

on running ./waf build I am receiving the following error

`../src/quic/model/quic-bbr.cc: In member function ‘void ns3::QuicBbr::InitPacingRate(ns3::Ptrns3::QuicSocketState)’:
../src/quic/model/quic-bbr.cc:148:11: error: no match for ‘operator==’ (operand types are ‘ns3::Time’ and ‘int’)
if (rtt == 0)
~~~~^~~~
In file included from ./ns3/tcp-congestion-ops.h:22:0,
from ./ns3/quic-congestion-ops.h:31,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/tcp-rate-ops.h:264:6: note: candidate: bool ns3::operator==(const ns3::TcpRateOps::TcpRateConnection&, const ns3::TcpRateOps::TcpRateConnection&)
bool operator== (TcpRateLinux::TcpRateConnection const & lhs, TcpRateLinux::TcpRateConnection const & rhs);
^~~~~~~~
./ns3/tcp-rate-ops.h:264:6: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::TcpRateOps::TcpRateConnection&’
./ns3/tcp-rate-ops.h:256:6: note: candidate: bool ns3::operator==(const ns3::TcpRateOps::TcpRateSample&, const ns3::TcpRateOps::TcpRateSample&)
bool operator== (TcpRateLinux::TcpRateSample const & lhs, TcpRateLinux::TcpRateSample const & rhs);
^~~~~~~~
./ns3/tcp-rate-ops.h:256:6: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::TcpRateOps::TcpRateSample&’
In file included from ./ns3/tcp-rate-ops.h:26:0,
from ./ns3/tcp-congestion-ops.h:22,
from ./ns3/quic-congestion-ops.h:31,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/traced-value.h:331:6: note: candidate: template<class T, class U> bool ns3::operator==(const U&, const ns3::TracedValue&)
bool operator == (const U &lhs, const TracedValue &rhs)
^~~~~~~~
./ns3/traced-value.h:331:6: note: template argument deduction/substitution failed:
../src/quic/model/quic-bbr.cc:148:14: note: mismatched types ‘const ns3::TracedValue’ and ‘int’
if (rtt == 0)
^
In file included from ./ns3/tcp-rate-ops.h:26:0,
from ./ns3/tcp-congestion-ops.h:22,
from ./ns3/quic-congestion-ops.h:31,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/traced-value.h:324:6: note: candidate: template<class T, class U> bool ns3::operator==(const ns3::TracedValue&, const U&)
bool operator == (const TracedValue &lhs, const U &rhs)
^~~~~~~~
./ns3/traced-value.h:324:6: note: template argument deduction/substitution failed:
../src/quic/model/quic-bbr.cc:148:14: note: ‘ns3::Time’ is not derived from ‘const ns3::TracedValue’
if (rtt == 0)
^
In file included from ./ns3/tcp-rate-ops.h:26:0,
from ./ns3/tcp-congestion-ops.h:22,
from ./ns3/quic-congestion-ops.h:31,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/traced-value.h:317:6: note: candidate: template<class T, class U> bool ns3::operator==(const ns3::TracedValue&, const ns3::TracedValue&)
bool operator == (const TracedValue &lhs, const TracedValue &rhs)
^~~~~~~~
./ns3/traced-value.h:317:6: note: template argument deduction/substitution failed:
../src/quic/model/quic-bbr.cc:148:14: note: ‘ns3::Time’ is not derived from ‘const ns3::TracedValue’
if (rtt == 0)
^
In file included from ./ns3/packet.h:32:0,
from ./ns3/tcp-tx-item.h:22,
from ./ns3/tcp-rate-ops.h:23,
from ./ns3/tcp-congestion-ops.h:22,
from ./ns3/quic-congestion-ops.h:31,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/mac48-address.h:203:13: note: candidate: bool ns3::operator==(const ns3::Mac48Address&, const ns3::Mac48Address&)
inline bool operator == (const Mac48Address &a, const Mac48Address &b)
^~~~~~~~
./ns3/mac48-address.h:203:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Mac48Address&’
In file included from ./ns3/quic-subheader.h:32:0,
from ./ns3/quic-congestion-ops.h:30,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/ipv6-address.h:674:13: note: candidate: bool ns3::operator==(const ns3::Ipv6Prefix&, const ns3::Ipv6Prefix&)
inline bool operator == (const Ipv6Prefix& a, const Ipv6Prefix& b)
^~~~~~~~
./ns3/ipv6-address.h:674:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv6Prefix&’
./ns3/ipv6-address.h:659:13: note: candidate: bool ns3::operator==(const ns3::Ipv6Address&, const ns3::Ipv6Address&)
inline bool operator == (const Ipv6Address& a, const Ipv6Address& b)
^~~~~~~~
./ns3/ipv6-address.h:659:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv6Address&’
In file included from ./ns3/ipv6-address.h:33:0,
from ./ns3/quic-subheader.h:32,
from ./ns3/quic-congestion-ops.h:30,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/mac8-address.h:152:6: note: candidate: bool ns3::operator==(const ns3::Mac8Address&, const ns3::Mac8Address&)
bool operator == (const Mac8Address &a, const Mac8Address &b);
^~~~~~~~
./ns3/mac8-address.h:152:6: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Mac8Address&’
In file included from ./ns3/quic-subheader.h:31:0,
from ./ns3/quic-congestion-ops.h:30,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/ipv4-address.h:455:13: note: candidate: bool ns3::operator==(const ns3::Ipv4Mask&, const ns3::Ipv4Mask&)
inline bool operator == (Ipv4Mask const &a, Ipv4Mask const &b)
^~~~~~~~
./ns3/ipv4-address.h:455:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv4Mask&’
./ns3/ipv4-address.h:406:13: note: candidate: bool ns3::operator==(const ns3::Ipv4Address&, const ns3::Ipv4Address&)
inline bool operator == (const Ipv4Address &a, const Ipv4Address &b)
^~~~~~~~
./ns3/ipv4-address.h:406:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv4Address&’
In file included from ./ns3/ipv4-address.h:26:0,
from ./ns3/quic-subheader.h:31,
from ./ns3/quic-congestion-ops.h:30,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/address.h:280:6: note: candidate: bool ns3::operator==(const ns3::Address&, const ns3::Address&)
bool operator == (const Address &a, const Address &b);
^~~~~~~~
./ns3/address.h:280:6: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Address&’
In file included from ./ns3/object-base.h:23:0,
from ./ns3/object.h:29,
from ./ns3/object-factory.h:24,
from ./ns3/simulator.h:29,
from ./ns3/timer-impl.h:24,
from ./ns3/timer.h:271,
from ./ns3/quic-congestion-ops.h:28,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/type-id.h:614:13: note: candidate: bool ns3::operator==(ns3::TypeId, ns3::TypeId)
inline bool operator == (TypeId a, TypeId b)
^~~~~~~~
./ns3/type-id.h:614:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘ns3::TypeId’
In file included from ./ns3/timer.h:25:0,
from ./ns3/quic-congestion-ops.h:28,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/event-id.h:142:1: note: candidate: bool ns3::operator==(const ns3::EventId&, const ns3::EventId&)
operator == (const EventId &a, const EventId &b)
^~~~~~~~
./ns3/event-id.h:142:1: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::EventId&’
In file included from ./ns3/timer.h:24:0,
from ./ns3/quic-congestion-ops.h:28,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/nstime.h:761:1: note: candidate: bool ns3::operator==(const ns3::Time&, const ns3::Time&)
operator == (const Time & lhs, const Time & rhs)
^~~~~~~~
./ns3/nstime.h:761:1: note: no known conversion for argument 2 from ‘int’ to ‘const ns3::Time&’
In file included from ./ns3/int64x64.h:30:0,
from ./ns3/nstime.h:26,
from ./ns3/timer.h:24,
from ./ns3/quic-congestion-ops.h:28,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/int64x64-128.h:378:13: note: candidate: bool ns3::operator==(const ns3::int64x64_t&, const ns3::int64x64_t&)
inline bool operator == (const int64x64_t & lhs, const int64x64_t & rhs)
^~~~~~~~
./ns3/int64x64-128.h:378:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::int64x64_t&’
In file included from ./ns3/attribute.h:25:0,
from ./ns3/nstime.h:24,
from ./ns3/timer.h:24,
from ./ns3/quic-congestion-ops.h:28,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/ptr.h:460:1: note: candidate: template<class T1, class T2> bool ns3::operator==(const ns3::Ptr&, const ns3::Ptr&)
operator == (Ptr const &lhs, Ptr const &rhs)
^~~~~~~~
./ns3/ptr.h:460:1: note: template argument deduction/substitution failed:
../src/quic/model/quic-bbr.cc:148:14: note: ‘ns3::Time’ is not derived from ‘const ns3::Ptr’
if (rtt == 0)
^
In file included from ./ns3/attribute.h:25:0,
from ./ns3/nstime.h:24,
from ./ns3/timer.h:24,
from ./ns3/quic-congestion-ops.h:28,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/ptr.h:439:1: note: candidate: template<class T1, class T2> bool ns3::operator==(const T1*, ns3::Ptr&)
operator == (T1 const lhs, Ptr &rhs)
^~~~~~~~
./ns3/ptr.h:439:1: note: template argument deduction/substitution failed:
../src/quic/model/quic-bbr.cc:148:14: note: mismatched types ‘const T1
’ and ‘ns3::Time’
if (rtt == 0)
^
In file included from ./ns3/attribute.h:25:0,
from ./ns3/nstime.h:24,
from ./ns3/timer.h:24,
from ./ns3/quic-congestion-ops.h:28,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/ptr.h:432:1: note: candidate: template<class T1, class T2> bool ns3::operator==(const ns3::Ptr&, const T2*)
operator == (Ptr const &lhs, T2 const rhs)
^~~~~~~~
./ns3/ptr.h:432:1: note: template argument deduction/substitution failed:
../src/quic/model/quic-bbr.cc:148:14: note: ‘ns3::Time’ is not derived from ‘const ns3::Ptr’
if (rtt == 0)
^
../src/quic/model/quic-bbr.cc: In member function ‘virtual void ns3::QuicBbr::CongestionStateSet(ns3::Ptrns3::TcpSocketState, ns3::TcpSocketState::TcpCongState_t)’:
../src/quic/model/quic-bbr.cc:618:41: error: no match for ‘operator!=’ (operand types are ‘ns3::Time’ and ‘int’)
m_rtProp = tcbd->m_lastRtt.Get () != 0 ? tcbd->m_lastRtt.Get () : Time::Max ();
~~~~~~~~~~~~~~~~~~~~~~~^~~~
In file included from ./ns3/attribute.h:25:0,
from ./ns3/nstime.h:24,
from ./ns3/timer.h:24,
from ./ns3/quic-congestion-ops.h:28,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/ptr.h:446:1: note: candidate: template<class T1, class T2> bool ns3::operator!=(const ns3::Ptr&, const T2
)
operator != (Ptr const &lhs, T2 const rhs)
^~~~~~~~
./ns3/ptr.h:446:1: note: template argument deduction/substitution failed:
../src/quic/model/quic-bbr.cc:618:44: note: ‘ns3::Time’ is not derived from ‘const ns3::Ptr’
m_rtProp = tcbd->m_lastRtt.Get () != 0 ? tcbd->m_lastRtt.Get () : Time::Max ();
^
In file included from ./ns3/attribute.h:25:0,
from ./ns3/nstime.h:24,
from ./ns3/timer.h:24,
from ./ns3/quic-congestion-ops.h:28,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/ptr.h:453:1: note: candidate: template<class T1, class T2> bool ns3::operator!=(const T1
, ns3::Ptr&)
operator != (T1 const lhs, Ptr &rhs)
^~~~~~~~
./ns3/ptr.h:453:1: note: template argument deduction/substitution failed:
../src/quic/model/quic-bbr.cc:618:44: note: mismatched types ‘const T1
’ and ‘ns3::Time’
m_rtProp = tcbd->m_lastRtt.Get () != 0 ? tcbd->m_lastRtt.Get () : Time::Max ();
^
In file included from ./ns3/attribute.h:25:0,
from ./ns3/nstime.h:24,
from ./ns3/timer.h:24,
from ./ns3/quic-congestion-ops.h:28,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/ptr.h:467:1: note: candidate: template<class T1, class T2> bool ns3::operator!=(const ns3::Ptr&, const ns3::Ptr&)
operator != (Ptr const &lhs, Ptr const &rhs)
^~~~~~~~
./ns3/ptr.h:467:1: note: template argument deduction/substitution failed:
../src/quic/model/quic-bbr.cc:618:44: note: ‘ns3::Time’ is not derived from ‘const ns3::Ptr’
m_rtProp = tcbd->m_lastRtt.Get () != 0 ? tcbd->m_lastRtt.Get () : Time::Max ();
^
In file included from ./ns3/nstime.h:26:0,
from ./ns3/timer.h:24,
from ./ns3/quic-congestion-ops.h:28,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/int64x64.h:144:13: note: candidate: bool ns3::operator!=(const ns3::int64x64_t&, const ns3::int64x64_t&)
inline bool operator != (const int64x64_t & lhs, const int64x64_t & rhs)
^~~~~~~~
./ns3/int64x64.h:144:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::int64x64_t&’
In file included from ./ns3/timer.h:24:0,
from ./ns3/quic-congestion-ops.h:28,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/nstime.h:773:1: note: candidate: bool ns3::operator!=(const ns3::Time&, const ns3::Time&)
operator != (const Time & lhs, const Time & rhs)
^~~~~~~~
./ns3/nstime.h:773:1: note: no known conversion for argument 2 from ‘int’ to ‘const ns3::Time&’
In file included from ./ns3/timer.h:25:0,
from ./ns3/quic-congestion-ops.h:28,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/event-id.h:153:1: note: candidate: bool ns3::operator!=(const ns3::EventId&, const ns3::EventId&)
operator != (const EventId &a, const EventId &b)
^~~~~~~~
./ns3/event-id.h:153:1: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::EventId&’
In file included from ./ns3/trace-source-accessor.h:24:0,
from ./ns3/type-id.h:25,
from ./ns3/object-base.h:23,
from ./ns3/object.h:29,
from ./ns3/object-factory.h:24,
from ./ns3/simulator.h:29,
from ./ns3/timer-impl.h:24,
from ./ns3/timer.h:271,
from ./ns3/quic-congestion-ops.h:28,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/callback.h:1606:6: note: candidate: template<class R, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9> bool ns3::operator!=(ns3::Callback<R, T1, T2, T3, T4, T5, T6, T7, T8, T9>, ns3::Callback<R, T1, T2, T3, T4, T5, T6, T7, T8, T9>)
bool operator != (Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> a, Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> b)
^~~~~~~~
./ns3/callback.h:1606:6: note: template argument deduction/substitution failed:
../src/quic/model/quic-bbr.cc:618:44: note: ‘ns3::Time’ is not derived from ‘ns3::Callback<R, T1, T2, T3, T4, T5, T6, T7, T8, T9>’
m_rtProp = tcbd->m_lastRtt.Get () != 0 ? tcbd->m_lastRtt.Get () : Time::Max ();
^
In file included from ./ns3/object-base.h:23:0,
from ./ns3/object.h:29,
from ./ns3/object-factory.h:24,
from ./ns3/simulator.h:29,
from ./ns3/timer-impl.h:24,
from ./ns3/timer.h:271,
from ./ns3/quic-congestion-ops.h:28,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/type-id.h:619:13: note: candidate: bool ns3::operator!=(ns3::TypeId, ns3::TypeId)
inline bool operator != (TypeId a, TypeId b)
^~~~~~~~
./ns3/type-id.h:619:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘ns3::TypeId’
In file included from ./ns3/ipv4-address.h:26:0,
from ./ns3/quic-subheader.h:31,
from ./ns3/quic-congestion-ops.h:30,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/address.h:281:6: note: candidate: bool ns3::operator!=(const ns3::Address&, const ns3::Address&)
bool operator != (const Address &a, const Address &b);
^~~~~~~~
./ns3/address.h:281:6: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Address&’
In file included from ./ns3/quic-subheader.h:31:0,
from ./ns3/quic-congestion-ops.h:30,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/ipv4-address.h:417:13: note: candidate: bool ns3::operator!=(const ns3::Ipv4Address&, const ns3::Ipv4Address&)
inline bool operator != (const Ipv4Address &a, const Ipv4Address &b)
^~~~~~~~
./ns3/ipv4-address.h:417:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv4Address&’
./ns3/ipv4-address.h:467:13: note: candidate: bool ns3::operator!=(const ns3::Ipv4Mask&, const ns3::Ipv4Mask&)
inline bool operator != (Ipv4Mask const &a, Ipv4Mask const &b)
^~~~~~~~
./ns3/ipv4-address.h:467:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv4Mask&’
In file included from ./ns3/ipv6-address.h:33:0,
from ./ns3/quic-subheader.h:32,
from ./ns3/quic-congestion-ops.h:30,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/mac8-address.h:161:6: note: candidate: bool ns3::operator!=(const ns3::Mac8Address&, const ns3::Mac8Address&)
bool operator != (const Mac8Address &a, const Mac8Address &b);
^~~~~~~~
./ns3/mac8-address.h:161:6: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Mac8Address&’
In file included from ./ns3/quic-subheader.h:32:0,
from ./ns3/quic-congestion-ops.h:30,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/ipv6-address.h:664:13: note: candidate: bool ns3::operator!=(const ns3::Ipv6Address&, const ns3::Ipv6Address&)
inline bool operator != (const Ipv6Address& a, const Ipv6Address& b)
^~~~~~~~
./ns3/ipv6-address.h:664:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv6Address&’
./ns3/ipv6-address.h:679:13: note: candidate: bool ns3::operator!=(const ns3::Ipv6Prefix&, const ns3::Ipv6Prefix&)
inline bool operator != (const Ipv6Prefix& a, const Ipv6Prefix& b)
^~~~~~~~
./ns3/ipv6-address.h:679:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv6Prefix&’
In file included from ./ns3/packet.h:32:0,
from ./ns3/tcp-tx-item.h:22,
from ./ns3/tcp-rate-ops.h:23,
from ./ns3/tcp-congestion-ops.h:22,
from ./ns3/quic-congestion-ops.h:31,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/mac48-address.h:207:13: note: candidate: bool ns3::operator!=(const ns3::Mac48Address&, const ns3::Mac48Address&)
inline bool operator != (const Mac48Address &a, const Mac48Address &b)
^~~~~~~~
./ns3/mac48-address.h:207:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Mac48Address&’
In file included from ./ns3/tcp-rate-ops.h:26:0,
from ./ns3/tcp-congestion-ops.h:22,
from ./ns3/quic-congestion-ops.h:31,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/traced-value.h:339:6: note: candidate: template<class T, class U> bool ns3::operator!=(const ns3::TracedValue&, const ns3::TracedValue&)
bool operator != (const TracedValue &lhs, const TracedValue &rhs)
^~~~~~~~
./ns3/traced-value.h:339:6: note: template argument deduction/substitution failed:
../src/quic/model/quic-bbr.cc:618:44: note: ‘ns3::Time’ is not derived from ‘const ns3::TracedValue’
m_rtProp = tcbd->m_lastRtt.Get () != 0 ? tcbd->m_lastRtt.Get () : Time::Max ();
^
In file included from ./ns3/tcp-rate-ops.h:26:0,
from ./ns3/tcp-congestion-ops.h:22,
from ./ns3/quic-congestion-ops.h:31,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/traced-value.h:346:6: note: candidate: template<class T, class U> bool ns3::operator!=(const ns3::TracedValue&, const U&)
bool operator != (const TracedValue &lhs, const U &rhs)
^~~~~~~~
./ns3/traced-value.h:346:6: note: template argument deduction/substitution failed:
../src/quic/model/quic-bbr.cc:618:44: note: ‘ns3::Time’ is not derived from ‘const ns3::TracedValue’
m_rtProp = tcbd->m_lastRtt.Get () != 0 ? tcbd->m_lastRtt.Get () : Time::Max ();
^
In file included from ./ns3/tcp-rate-ops.h:26:0,
from ./ns3/tcp-congestion-ops.h:22,
from ./ns3/quic-congestion-ops.h:31,
from ../src/quic/model/quic-bbr.h:25,
from ../src/quic/model/quic-bbr.cc:23:
./ns3/traced-value.h:353:6: note: candidate: template<class T, class U> bool ns3::operator!=(const U&, const ns3::TracedValue&)
bool operator != (const U &lhs, const TracedValue &rhs)
^~~~~~~~
./ns3/traced-value.h:353:6: note: template argument deduction/substitution failed:
../src/quic/model/quic-bbr.cc:618:44: note: mismatched types ‘const ns3::TracedValue’ and ‘int’
m_rtProp = tcbd->m_lastRtt.Get () != 0 ? tcbd->m_lastRtt.Get () : Time::Max ();
^

../src/quic/model/quic-socket-base.cc: In member function ‘void ns3::QuicSocketBase::SetReTxTimeout()’:
../src/quic/model/quic-socket-base.cc:1428:32: error: no match for ‘operator==’ (operand types are ‘ns3::Time’ and ‘int’)
if (m_tcb->m_smoothedRtt == 0)
~~~~~~~~~~~~~~~~~~~~~^~~~
In file included from ./ns3/calendar-scheduler.h:25:0,
from ./ns3/core-module.h:21,
from ../src/quic/model/quic-socket-base.cc:68:
./ns3/scheduler.h:320:13: note: candidate: bool ns3::operator==(const ns3::Scheduler::Event&, const ns3::Scheduler::Event&)
inline bool operator == (const Scheduler::Event &a,
^~~~~~~~
./ns3/scheduler.h:320:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Scheduler::Event&’
./ns3/scheduler.h:237:13: note: candidate: bool ns3::operator==(const ns3::Scheduler::EventKey&, const ns3::Scheduler::EventKey&)
inline bool operator == (const Scheduler::EventKey &a,
^~~~~~~~
./ns3/scheduler.h:237:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Scheduler::EventKey&’
In file included from ./ns3/tcp-congestion-ops.h:22:0,
from ../src/quic/model/quic-socket-base.h:43,
from ../src/quic/model/quic-socket-base.cc:50:
./ns3/tcp-rate-ops.h:264:6: note: candidate: bool ns3::operator==(const ns3::TcpRateOps::TcpRateConnection&, const ns3::TcpRateOps::TcpRateConnection&)
bool operator== (TcpRateLinux::TcpRateConnection const & lhs, TcpRateLinux::TcpRateConnection const & rhs);
^~~~~~~~
./ns3/tcp-rate-ops.h:264:6: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::TcpRateOps::TcpRateConnection&’
./ns3/tcp-rate-ops.h:256:6: note: candidate: bool ns3::operator==(const ns3::TcpRateOps::TcpRateSample&, const ns3::TcpRateOps::TcpRateSample&)
bool operator== (TcpRateLinux::TcpRateSample const & lhs, TcpRateLinux::TcpRateSample const & rhs);
^~~~~~~~
./ns3/tcp-rate-ops.h:256:6: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::TcpRateOps::TcpRateSample&’
In file included from ../src/quic/model/quic-socket-base.h:33:0,
from ../src/quic/model/quic-socket-base.cc:50:
./ns3/traced-value.h:331:6: note: candidate: template<class T, class U> bool ns3::operator==(const U&, const ns3::TracedValue&)
bool operator == (const U &lhs, const TracedValue &rhs)
^~~~~~~~
./ns3/traced-value.h:331:6: note: template argument deduction/substitution failed:
../src/quic/model/quic-socket-base.cc:1428:35: note: mismatched types ‘const ns3::TracedValue’ and ‘int’
if (m_tcb->m_smoothedRtt == 0)
^
In file included from ../src/quic/model/quic-socket-base.h:33:0,
from ../src/quic/model/quic-socket-base.cc:50:
./ns3/traced-value.h:324:6: note: candidate: template<class T, class U> bool ns3::operator==(const ns3::TracedValue&, const U&)
bool operator == (const TracedValue &lhs, const U &rhs)
^~~~~~~~
./ns3/traced-value.h:324:6: note: template argument deduction/substitution failed:
../src/quic/model/quic-socket-base.cc:1428:35: note: ‘ns3::Time’ is not derived from ‘const ns3::TracedValue’
if (m_tcb->m_smoothedRtt == 0)
^
In file included from ../src/quic/model/quic-socket-base.h:33:0,
from ../src/quic/model/quic-socket-base.cc:50:
./ns3/traced-value.h:317:6: note: candidate: template<class T, class U> bool ns3::operator==(const ns3::TracedValue&, const ns3::TracedValue&)
bool operator == (const TracedValue &lhs, const TracedValue &rhs)
^~~~~~~~
./ns3/traced-value.h:317:6: note: template argument deduction/substitution failed:
../src/quic/model/quic-socket-base.cc:1428:35: note: ‘ns3::Time’ is not derived from ‘const ns3::TracedValue’
if (m_tcb->m_smoothedRtt == 0)
^
In file included from ./ns3/simulator.h:24:0,
from ./ns3/simulation-singleton.h:101,
from ../src/quic/model/quic-socket-base.cc:41:
./ns3/event-id.h:142:1: note: candidate: bool ns3::operator==(const ns3::EventId&, const ns3::EventId&)
operator == (const EventId &a, const EventId &b)
^~~~~~~~
./ns3/event-id.h:142:1: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::EventId&’
In file included from ./ns3/ipv4-routing-protocol.h:29:0,
from ../src/quic/model/quic-socket-base.cc:39:
./ns3/nstime.h:761:1: note: candidate: bool ns3::operator==(const ns3::Time&, const ns3::Time&)
operator == (const Time & lhs, const Time & rhs)
^~~~~~~~
./ns3/nstime.h:761:1: note: no known conversion for argument 2 from ‘int’ to ‘const ns3::Time&’
In file included from ./ns3/int64x64.h:30:0,
from ./ns3/nstime.h:26,
from ./ns3/ipv4-routing-protocol.h:29,
from ../src/quic/model/quic-socket-base.cc:39:
./ns3/int64x64-128.h:378:13: note: candidate: bool ns3::operator==(const ns3::int64x64_t&, const ns3::int64x64_t&)
inline bool operator == (const int64x64_t & lhs, const int64x64_t & rhs)
^~~~~~~~
./ns3/int64x64-128.h:378:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::int64x64_t&’
In file included from ./ns3/ipv6.h:33:0,
from ../src/quic/model/quic-socket-base.cc:35:
./ns3/ipv6-interface-address.h:224:13: note: candidate: bool ns3::operator==(const ns3::Ipv6InterfaceAddress&, const ns3::Ipv6InterfaceAddress&)
inline bool operator == (const Ipv6InterfaceAddress& a, const Ipv6InterfaceAddress& b)
^~~~~~~~
./ns3/ipv6-interface-address.h:224:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv6InterfaceAddress&’
In file included from ./ns3/ipv4.h:29:0,
from ../src/quic/model/quic-socket-base.cc:34:
./ns3/ipv4-interface-address.h:169:13: note: candidate: bool ns3::operator==(const ns3::Ipv4InterfaceAddress&, const ns3::Ipv4InterfaceAddress&)
inline bool operator == (const Ipv4InterfaceAddress &a, const Ipv4InterfaceAddress &b)
^~~~~~~~
./ns3/ipv4-interface-address.h:169:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv4InterfaceAddress&’
In file included from ./ns3/packet.h:32:0,
from ./ns3/net-device.h:28,
from ./ns3/node.h:29,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/mac48-address.h:203:13: note: candidate: bool ns3::operator==(const ns3::Mac48Address&, const ns3::Mac48Address&)
inline bool operator == (const Mac48Address &a, const Mac48Address &b)
^~~~~~~~
./ns3/mac48-address.h:203:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Mac48Address&’
In file included from ./ns3/mac48-address.h:28:0,
from ./ns3/packet.h:32,
from ./ns3/net-device.h:28,
from ./ns3/node.h:29,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/ipv6-address.h:674:13: note: candidate: bool ns3::operator==(const ns3::Ipv6Prefix&, const ns3::Ipv6Prefix&)
inline bool operator == (const Ipv6Prefix& a, const Ipv6Prefix& b)
^~~~~~~~
./ns3/ipv6-address.h:674:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv6Prefix&’
./ns3/ipv6-address.h:659:13: note: candidate: bool ns3::operator==(const ns3::Ipv6Address&, const ns3::Ipv6Address&)
inline bool operator == (const Ipv6Address& a, const Ipv6Address& b)
^~~~~~~~
./ns3/ipv6-address.h:659:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv6Address&’
In file included from ./ns3/ipv6-address.h:33:0,
from ./ns3/mac48-address.h:28,
from ./ns3/packet.h:32,
from ./ns3/net-device.h:28,
from ./ns3/node.h:29,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/mac8-address.h:152:6: note: candidate: bool ns3::operator==(const ns3::Mac8Address&, const ns3::Mac8Address&)
bool operator == (const Mac8Address &a, const Mac8Address &b);
^~~~~~~~
./ns3/mac8-address.h:152:6: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Mac8Address&’
In file included from ./ns3/mac48-address.h:27:0,
from ./ns3/packet.h:32,
from ./ns3/net-device.h:28,
from ./ns3/node.h:29,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/ipv4-address.h:455:13: note: candidate: bool ns3::operator==(const ns3::Ipv4Mask&, const ns3::Ipv4Mask&)
inline bool operator == (Ipv4Mask const &a, Ipv4Mask const &b)
^~~~~~~~
./ns3/ipv4-address.h:455:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv4Mask&’
./ns3/ipv4-address.h:406:13: note: candidate: bool ns3::operator==(const ns3::Ipv4Address&, const ns3::Ipv4Address&)
inline bool operator == (const Ipv4Address &a, const Ipv4Address &b)
^~~~~~~~
./ns3/ipv4-address.h:406:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv4Address&’
In file included from ./ns3/ipv4-address.h:26:0,
from ./ns3/mac48-address.h:27,
from ./ns3/packet.h:32,
from ./ns3/net-device.h:28,
from ./ns3/node.h:29,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/address.h:280:6: note: candidate: bool ns3::operator==(const ns3::Address&, const ns3::Address&)
bool operator == (const Address &a, const Address &b);
^~~~~~~~
./ns3/address.h:280:6: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Address&’
In file included from ./ns3/object-base.h:23:0,
from ./ns3/object.h:29,
from ./ns3/node.h:26,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/type-id.h:614:13: note: candidate: bool ns3::operator==(ns3::TypeId, ns3::TypeId)
inline bool operator == (TypeId a, TypeId b)
^~~~~~~~
./ns3/type-id.h:614:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘ns3::TypeId’
In file included from ./ns3/object.h:27:0,
from ./ns3/node.h:26,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/ptr.h:460:1: note: candidate: template<class T1, class T2> bool ns3::operator==(const ns3::Ptr&, const ns3::Ptr&)
operator == (Ptr const &lhs, Ptr const &rhs)
^~~~~~~~
./ns3/ptr.h:460:1: note: template argument deduction/substitution failed:
../src/quic/model/quic-socket-base.cc:1428:35: note: ‘ns3::Time’ is not derived from ‘const ns3::Ptr’
if (m_tcb->m_smoothedRtt == 0)
^
In file included from ./ns3/object.h:27:0,
from ./ns3/node.h:26,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/ptr.h:439:1: note: candidate: template<class T1, class T2> bool ns3::operator==(const T1*, ns3::Ptr&)
operator == (T1 const lhs, Ptr &rhs)
^~~~~~~~
./ns3/ptr.h:439:1: note: template argument deduction/substitution failed:
../src/quic/model/quic-socket-base.cc:1428:35: note: mismatched types ‘const T1
’ and ‘ns3::Time’
if (m_tcb->m_smoothedRtt == 0)
^
In file included from ./ns3/object.h:27:0,
from ./ns3/node.h:26,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/ptr.h:432:1: note: candidate: template<class T1, class T2> bool ns3::operator==(const ns3::Ptr&, const T2*)
operator == (Ptr const &lhs, T2 const rhs)
^~~~~~~~
./ns3/ptr.h:432:1: note: template argument deduction/substitution failed:
../src/quic/model/quic-socket-base.cc:1428:35: note: ‘ns3::Time’ is not derived from ‘const ns3::Ptr’
if (m_tcb->m_smoothedRtt == 0)
^
../src/quic/model/quic-socket-base.cc:1441:30: error: no match for ‘operator!=’ (operand types are ‘ns3::Time’ and ‘int’)
else if (m_tcb->m_lossTime != 0)
~~~~~~~~~~~~~~~~~~^~~~
In file included from ./ns3/calendar-scheduler.h:25:0,
from ./ns3/core-module.h:21,
from ../src/quic/model/quic-socket-base.cc:68:
./ns3/scheduler.h:333:13: note: candidate: bool ns3::operator!=(const ns3::Scheduler::Event&, const ns3::Scheduler::Event&)
inline bool operator != (const Scheduler::Event &a,
^~~~~~~~
./ns3/scheduler.h:333:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Scheduler::Event&’
./ns3/scheduler.h:251:13: note: candidate: bool ns3::operator!=(const ns3::Scheduler::EventKey&, const ns3::Scheduler::EventKey&)
inline bool operator != (const Scheduler::EventKey &a,
^~~~~~~~
./ns3/scheduler.h:251:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Scheduler::EventKey&’
In file included from ../src/quic/model/quic-socket-base.h:33:0,
from ../src/quic/model/quic-socket-base.cc:50:
./ns3/traced-value.h:353:6: note: candidate: template<class T, class U> bool ns3::operator!=(const U&, const ns3::TracedValue&)
bool operator != (const U &lhs, const TracedValue &rhs)
^~~~~~~~
./ns3/traced-value.h:353:6: note: template argument deduction/substitution failed:
../src/quic/model/quic-socket-base.cc:1441:33: note: mismatched types ‘const ns3::TracedValue’ and ‘int’
else if (m_tcb->m_lossTime != 0)
^
In file included from ../src/quic/model/quic-socket-base.h:33:0,
from ../src/quic/model/quic-socket-base.cc:50:
./ns3/traced-value.h:346:6: note: candidate: template<class T, class U> bool ns3::operator!=(const ns3::TracedValue&, const U&)
bool operator != (const TracedValue &lhs, const U &rhs)
^~~~~~~~
./ns3/traced-value.h:346:6: note: template argument deduction/substitution failed:
../src/quic/model/quic-socket-base.cc:1441:33: note: ‘ns3::Time’ is not derived from ‘const ns3::TracedValue’
else if (m_tcb->m_lossTime != 0)
^
In file included from ../src/quic/model/quic-socket-base.h:33:0,
from ../src/quic/model/quic-socket-base.cc:50:
./ns3/traced-value.h:339:6: note: candidate: template<class T, class U> bool ns3::operator!=(const ns3::TracedValue&, const ns3::TracedValue&)
bool operator != (const TracedValue &lhs, const TracedValue &rhs)
^~~~~~~~
./ns3/traced-value.h:339:6: note: template argument deduction/substitution failed:
../src/quic/model/quic-socket-base.cc:1441:33: note: ‘ns3::Time’ is not derived from ‘const ns3::TracedValue’
else if (m_tcb->m_lossTime != 0)
^
In file included from ./ns3/simulator.h:24:0,
from ./ns3/simulation-singleton.h:101,
from ../src/quic/model/quic-socket-base.cc:41:
./ns3/event-id.h:153:1: note: candidate: bool ns3::operator!=(const ns3::EventId&, const ns3::EventId&)
operator != (const EventId &a, const EventId &b)
^~~~~~~~
./ns3/event-id.h:153:1: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::EventId&’
In file included from ./ns3/ipv4-routing-protocol.h:29:0,
from ../src/quic/model/quic-socket-base.cc:39:
./ns3/nstime.h:773:1: note: candidate: bool ns3::operator!=(const ns3::Time&, const ns3::Time&)
operator != (const Time & lhs, const Time & rhs)
^~~~~~~~
./ns3/nstime.h:773:1: note: no known conversion for argument 2 from ‘int’ to ‘const ns3::Time&’
In file included from ./ns3/nstime.h:26:0,
from ./ns3/ipv4-routing-protocol.h:29,
from ../src/quic/model/quic-socket-base.cc:39:
./ns3/int64x64.h:144:13: note: candidate: bool ns3::operator!=(const ns3::int64x64_t&, const ns3::int64x64_t&)
inline bool operator != (const int64x64_t & lhs, const int64x64_t & rhs)
^~~~~~~~
./ns3/int64x64.h:144:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::int64x64_t&’
In file included from ./ns3/ipv6.h:33:0,
from ../src/quic/model/quic-socket-base.cc:35:
./ns3/ipv6-interface-address.h:230:13: note: candidate: bool ns3::operator!=(const ns3::Ipv6InterfaceAddress&, const ns3::Ipv6InterfaceAddress&)
inline bool operator != (const Ipv6InterfaceAddress& a, const Ipv6InterfaceAddress& b)
^~~~~~~~
./ns3/ipv6-interface-address.h:230:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv6InterfaceAddress&’
In file included from ./ns3/ipv4.h:29:0,
from ../src/quic/model/quic-socket-base.cc:34:
./ns3/ipv4-interface-address.h:174:13: note: candidate: bool ns3::operator!=(const ns3::Ipv4InterfaceAddress&, const ns3::Ipv4InterfaceAddress&)
inline bool operator != (const Ipv4InterfaceAddress &a, const Ipv4InterfaceAddress &b)
^~~~~~~~
./ns3/ipv4-interface-address.h:174:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv4InterfaceAddress&’
In file included from ./ns3/packet.h:32:0,
from ./ns3/net-device.h:28,
from ./ns3/node.h:29,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/mac48-address.h:207:13: note: candidate: bool ns3::operator!=(const ns3::Mac48Address&, const ns3::Mac48Address&)
inline bool operator != (const Mac48Address &a, const Mac48Address &b)
^~~~~~~~
./ns3/mac48-address.h:207:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Mac48Address&’
In file included from ./ns3/mac48-address.h:28:0,
from ./ns3/packet.h:32,
from ./ns3/net-device.h:28,
from ./ns3/node.h:29,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/ipv6-address.h:679:13: note: candidate: bool ns3::operator!=(const ns3::Ipv6Prefix&, const ns3::Ipv6Prefix&)
inline bool operator != (const Ipv6Prefix& a, const Ipv6Prefix& b)
^~~~~~~~
./ns3/ipv6-address.h:679:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv6Prefix&’
./ns3/ipv6-address.h:664:13: note: candidate: bool ns3::operator!=(const ns3::Ipv6Address&, const ns3::Ipv6Address&)
inline bool operator != (const Ipv6Address& a, const Ipv6Address& b)
^~~~~~~~
./ns3/ipv6-address.h:664:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv6Address&’
In file included from ./ns3/ipv6-address.h:33:0,
from ./ns3/mac48-address.h:28,
from ./ns3/packet.h:32,
from ./ns3/net-device.h:28,
from ./ns3/node.h:29,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/mac8-address.h:161:6: note: candidate: bool ns3::operator!=(const ns3::Mac8Address&, const ns3::Mac8Address&)
bool operator != (const Mac8Address &a, const Mac8Address &b);
^~~~~~~~
./ns3/mac8-address.h:161:6: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Mac8Address&’
In file included from ./ns3/mac48-address.h:27:0,
from ./ns3/packet.h:32,
from ./ns3/net-device.h:28,
from ./ns3/node.h:29,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/ipv4-address.h:467:13: note: candidate: bool ns3::operator!=(const ns3::Ipv4Mask&, const ns3::Ipv4Mask&)
inline bool operator != (Ipv4Mask const &a, Ipv4Mask const &b)
^~~~~~~~
./ns3/ipv4-address.h:467:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv4Mask&’
./ns3/ipv4-address.h:417:13: note: candidate: bool ns3::operator!=(const ns3::Ipv4Address&, const ns3::Ipv4Address&)
inline bool operator != (const Ipv4Address &a, const Ipv4Address &b)
^~~~~~~~
./ns3/ipv4-address.h:417:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv4Address&’
In file included from ./ns3/ipv4-address.h:26:0,
from ./ns3/mac48-address.h:27,
from ./ns3/packet.h:32,
from ./ns3/net-device.h:28,
from ./ns3/node.h:29,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/address.h:281:6: note: candidate: bool ns3::operator!=(const ns3::Address&, const ns3::Address&)
bool operator != (const Address &a, const Address &b);
^~~~~~~~
./ns3/address.h:281:6: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Address&’
In file included from ./ns3/object-base.h:23:0,
from ./ns3/object.h:29,
from ./ns3/node.h:26,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/type-id.h:619:13: note: candidate: bool ns3::operator!=(ns3::TypeId, ns3::TypeId)
inline bool operator != (TypeId a, TypeId b)
^~~~~~~~
./ns3/type-id.h:619:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘ns3::TypeId’
In file included from ./ns3/trace-source-accessor.h:24:0,
from ./ns3/type-id.h:25,
from ./ns3/object-base.h:23,
from ./ns3/object.h:29,
from ./ns3/node.h:26,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/callback.h:1606:6: note: candidate: template<class R, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9> bool ns3::operator!=(ns3::Callback<R, T1, T2, T3, T4, T5, T6, T7, T8, T9>, ns3::Callback<R, T1, T2, T3, T4, T5, T6, T7, T8, T9>)
bool operator != (Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> a, Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> b)
^~~~~~~~
./ns3/callback.h:1606:6: note: template argument deduction/substitution failed:
../src/quic/model/quic-socket-base.cc:1441:33: note: ‘ns3::Time’ is not derived from ‘ns3::Callback<R, T1, T2, T3, T4, T5, T6, T7, T8, T9>’
else if (m_tcb->m_lossTime != 0)
^
In file included from ./ns3/object.h:27:0,
from ./ns3/node.h:26,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/ptr.h:467:1: note: candidate: template<class T1, class T2> bool ns3::operator!=(const ns3::Ptr&, const ns3::Ptr&)
operator != (Ptr const &lhs, Ptr const &rhs)
^~~~~~~~
./ns3/ptr.h:467:1: note: template argument deduction/substitution failed:
../src/quic/model/quic-socket-base.cc:1441:33: note: ‘ns3::Time’ is not derived from ‘const ns3::Ptr’
else if (m_tcb->m_lossTime != 0)
^
In file included from ./ns3/object.h:27:0,
from ./ns3/node.h:26,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/ptr.h:453:1: note: candidate: template<class T1, class T2> bool ns3::operator!=(const T1
, ns3::Ptr&)
operator != (T1 const lhs, Ptr &rhs)
^~~~~~~~
./ns3/ptr.h:453:1: note: template argument deduction/substitution failed:
../src/quic/model/quic-socket-base.cc:1441:33: note: mismatched types ‘const T1
’ and ‘ns3::Time’
else if (m_tcb->m_lossTime != 0)
^
In file included from ./ns3/object.h:27:0,
from ./ns3/node.h:26,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/ptr.h:446:1: note: candidate: template<class T1, class T2> bool ns3::operator!=(const ns3::Ptr&, const T2*)
operator != (Ptr const &lhs, T2 const rhs)
^~~~~~~~
./ns3/ptr.h:446:1: note: template argument deduction/substitution failed:
../src/quic/model/quic-socket-base.cc:1441:33: note: ‘ns3::Time’ is not derived from ‘const ns3::Ptr’
else if (m_tcb->m_lossTime != 0)
^
../src/quic/model/quic-socket-base.cc: In member function ‘void ns3::QuicSocketBase::ReTxTimeout()’:
../src/quic/model/quic-socket-base.cc:1514:57: error: no match for ‘operator!=’ (operand types are ‘ns3::Time’ and ‘int’)
else if (m_tcb->m_alarmType == 1 && m_tcb->m_lossTime != 0)
~~~~~~~~~~~~~~~~~~^~~~
In file included from ./ns3/calendar-scheduler.h:25:0,
from ./ns3/core-module.h:21,
from ../src/quic/model/quic-socket-base.cc:68:
./ns3/scheduler.h:333:13: note: candidate: bool ns3::operator!=(const ns3::Scheduler::Event&, const ns3::Scheduler::Event&)
inline bool operator != (const Scheduler::Event &a,
^~~~~~~~
./ns3/scheduler.h:333:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Scheduler::Event&’
./ns3/scheduler.h:251:13: note: candidate: bool ns3::operator!=(const ns3::Scheduler::EventKey&, const ns3::Scheduler::EventKey&)
inline bool operator != (const Scheduler::EventKey &a,
^~~~~~~~
./ns3/scheduler.h:251:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Scheduler::EventKey&’
In file included from ../src/quic/model/quic-socket-base.h:33:0,
from ../src/quic/model/quic-socket-base.cc:50:
./ns3/traced-value.h:353:6: note: candidate: template<class T, class U> bool ns3::operator!=(const U&, const ns3::TracedValue&)
bool operator != (const U &lhs, const TracedValue &rhs)
^~~~~~~~
./ns3/traced-value.h:353:6: note: template argument deduction/substitution failed:
../src/quic/model/quic-socket-base.cc:1514:60: note: mismatched types ‘const ns3::TracedValue’ and ‘int’
else if (m_tcb->m_alarmType == 1 && m_tcb->m_lossTime != 0)
^
In file included from ../src/quic/model/quic-socket-base.h:33:0,
from ../src/quic/model/quic-socket-base.cc:50:
./ns3/traced-value.h:346:6: note: candidate: template<class T, class U> bool ns3::operator!=(const ns3::TracedValue&, const U&)
bool operator != (const TracedValue &lhs, const U &rhs)
^~~~~~~~
./ns3/traced-value.h:346:6: note: template argument deduction/substitution failed:
../src/quic/model/quic-socket-base.cc:1514:60: note: ‘ns3::Time’ is not derived from ‘const ns3::TracedValue’
else if (m_tcb->m_alarmType == 1 && m_tcb->m_lossTime != 0)
^
In file included from ../src/quic/model/quic-socket-base.h:33:0,
from ../src/quic/model/quic-socket-base.cc:50:
./ns3/traced-value.h:339:6: note: candidate: template<class T, class U> bool ns3::operator!=(const ns3::TracedValue&, const ns3::TracedValue&)
bool operator != (const TracedValue &lhs, const TracedValue &rhs)
^~~~~~~~
./ns3/traced-value.h:339:6: note: template argument deduction/substitution failed:
../src/quic/model/quic-socket-base.cc:1514:60: note: ‘ns3::Time’ is not derived from ‘const ns3::TracedValue’
else if (m_tcb->m_alarmType == 1 && m_tcb->m_lossTime != 0)
^
In file included from ./ns3/simulator.h:24:0,
from ./ns3/simulation-singleton.h:101,
from ../src/quic/model/quic-socket-base.cc:41:
./ns3/event-id.h:153:1: note: candidate: bool ns3::operator!=(const ns3::EventId&, const ns3::EventId&)
operator != (const EventId &a, const EventId &b)
^~~~~~~~
./ns3/event-id.h:153:1: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::EventId&’
In file included from ./ns3/ipv4-routing-protocol.h:29:0,
from ../src/quic/model/quic-socket-base.cc:39:
./ns3/nstime.h:773:1: note: candidate: bool ns3::operator!=(const ns3::Time&, const ns3::Time&)
operator != (const Time & lhs, const Time & rhs)
^~~~~~~~
./ns3/nstime.h:773:1: note: no known conversion for argument 2 from ‘int’ to ‘const ns3::Time&’
In file included from ./ns3/nstime.h:26:0,
from ./ns3/ipv4-routing-protocol.h:29,
from ../src/quic/model/quic-socket-base.cc:39:
./ns3/int64x64.h:144:13: note: candidate: bool ns3::operator!=(const ns3::int64x64_t&, const ns3::int64x64_t&)
inline bool operator != (const int64x64_t & lhs, const int64x64_t & rhs)
^~~~~~~~
./ns3/int64x64.h:144:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::int64x64_t&’
In file included from ./ns3/ipv6.h:33:0,
from ../src/quic/model/quic-socket-base.cc:35:
./ns3/ipv6-interface-address.h:230:13: note: candidate: bool ns3::operator!=(const ns3::Ipv6InterfaceAddress&, const ns3::Ipv6InterfaceAddress&)
inline bool operator != (const Ipv6InterfaceAddress& a, const Ipv6InterfaceAddress& b)
^~~~~~~~
./ns3/ipv6-interface-address.h:230:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv6InterfaceAddress&’
In file included from ./ns3/ipv4.h:29:0,
from ../src/quic/model/quic-socket-base.cc:34:
./ns3/ipv4-interface-address.h:174:13: note: candidate: bool ns3::operator!=(const ns3::Ipv4InterfaceAddress&, const ns3::Ipv4InterfaceAddress&)
inline bool operator != (const Ipv4InterfaceAddress &a, const Ipv4InterfaceAddress &b)
^~~~~~~~
./ns3/ipv4-interface-address.h:174:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv4InterfaceAddress&’
In file included from ./ns3/packet.h:32:0,
from ./ns3/net-device.h:28,
from ./ns3/node.h:29,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/mac48-address.h:207:13: note: candidate: bool ns3::operator!=(const ns3::Mac48Address&, const ns3::Mac48Address&)
inline bool operator != (const Mac48Address &a, const Mac48Address &b)
^~~~~~~~
./ns3/mac48-address.h:207:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Mac48Address&’
In file included from ./ns3/mac48-address.h:28:0,
from ./ns3/packet.h:32,
from ./ns3/net-device.h:28,
from ./ns3/node.h:29,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/ipv6-address.h:679:13: note: candidate: bool ns3::operator!=(const ns3::Ipv6Prefix&, const ns3::Ipv6Prefix&)
inline bool operator != (const Ipv6Prefix& a, const Ipv6Prefix& b)
^~~~~~~~
./ns3/ipv6-address.h:679:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv6Prefix&’
./ns3/ipv6-address.h:664:13: note: candidate: bool ns3::operator!=(const ns3::Ipv6Address&, const ns3::Ipv6Address&)
inline bool operator != (const Ipv6Address& a, const Ipv6Address& b)
^~~~~~~~
./ns3/ipv6-address.h:664:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv6Address&’
In file included from ./ns3/ipv6-address.h:33:0,
from ./ns3/mac48-address.h:28,
from ./ns3/packet.h:32,
from ./ns3/net-device.h:28,
from ./ns3/node.h:29,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/mac8-address.h:161:6: note: candidate: bool ns3::operator!=(const ns3::Mac8Address&, const ns3::Mac8Address&)
bool operator != (const Mac8Address &a, const Mac8Address &b);
^~~~~~~~
./ns3/mac8-address.h:161:6: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Mac8Address&’
In file included from ./ns3/mac48-address.h:27:0,
from ./ns3/packet.h:32,
from ./ns3/net-device.h:28,
from ./ns3/node.h:29,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/ipv4-address.h:467:13: note: candidate: bool ns3::operator!=(const ns3::Ipv4Mask&, const ns3::Ipv4Mask&)
inline bool operator != (Ipv4Mask const &a, Ipv4Mask const &b)
^~~~~~~~
./ns3/ipv4-address.h:467:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv4Mask&’
./ns3/ipv4-address.h:417:13: note: candidate: bool ns3::operator!=(const ns3::Ipv4Address&, const ns3::Ipv4Address&)
inline bool operator != (const Ipv4Address &a, const Ipv4Address &b)
^~~~~~~~
./ns3/ipv4-address.h:417:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Ipv4Address&’
In file included from ./ns3/ipv4-address.h:26:0,
from ./ns3/mac48-address.h:27,
from ./ns3/packet.h:32,
from ./ns3/net-device.h:28,
from ./ns3/node.h:29,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/address.h:281:6: note: candidate: bool ns3::operator!=(const ns3::Address&, const ns3::Address&)
bool operator != (const Address &a, const Address &b);
^~~~~~~~
./ns3/address.h:281:6: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘const ns3::Address&’
In file included from ./ns3/object-base.h:23:0,
from ./ns3/object.h:29,
from ./ns3/node.h:26,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/type-id.h:619:13: note: candidate: bool ns3::operator!=(ns3::TypeId, ns3::TypeId)
inline bool operator != (TypeId a, TypeId b)
^~~~~~~~
./ns3/type-id.h:619:13: note: no known conversion for argument 1 from ‘ns3::Time’ to ‘ns3::TypeId’
In file included from ./ns3/trace-source-accessor.h:24:0,
from ./ns3/type-id.h:25,
from ./ns3/object-base.h:23,
from ./ns3/object.h:29,
from ./ns3/node.h:26,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/callback.h:1606:6: note: candidate: template<class R, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9> bool ns3::operator!=(ns3::Callback<R, T1, T2, T3, T4, T5, T6, T7, T8, T9>, ns3::Callback<R, T1, T2, T3, T4, T5, T6, T7, T8, T9>)
bool operator != (Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> a, Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> b)
^~~~~~~~
./ns3/callback.h:1606:6: note: template argument deduction/substitution failed:
../src/quic/model/quic-socket-base.cc:1514:60: note: ‘ns3::Time’ is not derived from ‘ns3::Callback<R, T1, T2, T3, T4, T5, T6, T7, T8, T9>’
else if (m_tcb->m_alarmType == 1 && m_tcb->m_lossTime != 0)
^
In file included from ./ns3/object.h:27:0,
from ./ns3/node.h:26,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/ptr.h:467:1: note: candidate: template<class T1, class T2> bool ns3::operator!=(const ns3::Ptr&, const ns3::Ptr&)
operator != (Ptr const &lhs, Ptr const &rhs)
^~~~~~~~
./ns3/ptr.h:467:1: note: template argument deduction/substitution failed:
../src/quic/model/quic-socket-base.cc:1514:60: note: ‘ns3::Time’ is not derived from ‘const ns3::Ptr’
else if (m_tcb->m_alarmType == 1 && m_tcb->m_lossTime != 0)
^
In file included from ./ns3/object.h:27:0,
from ./ns3/node.h:26,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/ptr.h:453:1: note: candidate: template<class T1, class T2> bool ns3::operator!=(const T1
, ns3::Ptr&)
operator != (T1 const lhs, Ptr &rhs)
^~~~~~~~
./ns3/ptr.h:453:1: note: template argument deduction/substitution failed:
../src/quic/model/quic-socket-base.cc:1514:60: note: mismatched types ‘const T1
’ and ‘ns3::Time’
else if (m_tcb->m_alarmType == 1 && m_tcb->m_lossTime != 0)
^
In file included from ./ns3/object.h:27:0,
from ./ns3/node.h:26,
from ../src/quic/model/quic-socket-base.cc:30:
./ns3/ptr.h:446:1: note: candidate: template<class T1, class T2> bool ns3::operator!=(const ns3::Ptr&, const T2*)
operator != (Ptr const &lhs, T2 const *rhs)
^~~~~~~~
./ns3/ptr.h:446:1: note: template argument deduction/substitution failed:
../src/quic/model/quic-socket-base.cc:1514:60: note: ‘ns3::Time’ is not derived from ‘const ns3::Ptr’
else if (m_tcb->m_alarmType == 1 && m_tcb->m_lossTime != 0)
^

Waf: Leaving directory /home/bhavy/Desktop/sending_and_receiving_data_with_sockets/ns-3-dev/build' Build failed -> task in 'ns3-quic' failed with exit status 1 (run with -v to display more information) -> task in 'ns3-quic' failed with exit status 1 (run with -v to display more information)

Quic build Error

../src/applications/model/quic-echo-client.cc:34:10: fatal error: ns3/quic-header.h: No such file or directory
#include "ns3/quic-header.h"
compilation terminated.

This message shows while building the ns3 file. I am using ns3.32 on Ubuntu 18 and I copy the Quic file in the ns3.32 and also edit the application/wscript.
But when I build the ns3 after making the changes then this error shows..

Anyone knows about this error solution?

Indefinite long Simulation time while using Quic socket for large data transfer

Hi,

I am using Quic socket for large Data transfer in a simple Network topology. The simulation time is set to 500 sec while the Quic client app stops sending data at 250 sec. However, the simulation runs for an indefinite time (left it over the weekend but didn't end).

Furthermore, when I reduce the link Data rate from 100 Mbps to 10 Mbps, the simulation ends normally within a few hours. It seems like a high data rate increase the events which increases the simulation time. The same settings with TCP sockets work normally.

Is there any way to solve this issue? Please see the attached scenario.

PS: I have reduced all the unnecessary IO operations and also tried to configure ns3 in optimized mode but no gain.

Thank you
myfirstnetquic.cc.txt

How to get the one socket for each connection?

Thank you for this implementation of the QUIC protocol!

I'm trying to build a peer-to-peer application based on the ns3 QUIC implementation. I'm however a little confused on the usage of the API. Typically, there would be two ways to go about it:

  1. the UDP way (all nodes hold one listening socket for all communications, message endpoints are specified via parameters to SentTo/RecvFrom calls)
  2. the TCP way (all nodes hold one listening socket and also retrieve one socket per connection, via Accept/Connect)

However, with the QUIC implementation, both approaches seem to fail:

  1. does not work, since the address supplied to SendTo is simply ignored (cf. https://github.com/signetlabdei/quic/blob/master/model/quic-socket-base.cc#L1635), i.e., on the 'client' side one socket per connection is required.
  2. does not work because there is no HandleAccept callback which allows to retrieve one socket for each connection on the 'server' side. Of course, I could establish one connection for each direction, however, I'd rather not do it this way.

What is the recommended way of doing this? Is there a way on the 'server' side to retrieve a socket for each incoming connection? Or does this even happen automatically when the HandleRead callback is called for the first time?

Also, as a side-question: Do I understand correctly that supplying the stream IDs is not mandatory, because the protocol will apply load balancing?

Using multiple quic streams

Hi,
How can we change the number of Quic streams to use?
In quic-client.cc there is NumStreams attribute but it takes only 1 or 2 values not more than that. Also, I am not using QuicClient Class. I am using onoff application with Quic socket.

Does quic maintain a separate buffer for each stream?

Quic integration

Anyone knows about that how we can use quic instead of udp/tcp. I tried but they didn't works.
Hoping for a positive and quick response.

Thanks

Error: Assert socketFactory != 0 during runtime.

Hello,

I'm trying to get the QUIC implementation working in an application of mine. For that I try to create a QUIC socket:

ns3::TypeId tid = ns3::TypeId::LookupByName ("ns3::QuicSocketFactory");

m_socket = ns3::Socket::CreateSocket (GetNode (), tid);

While this code builds fine for me, ns-3 crashes during runtime, giving the error:

assert failed. cond="socketFactory != 0", +0.000000000s -1 file=../../src/network/model/socket.cc, line=77
libc++abi.dylib: terminating

It seems, that curiously, the QuicSocketFactory is not found during runtime. I tried this on ns-3.32 and ns-3-dev running on macOS, and with the quic version living in contrib (as described in the ns-3 App Store), as well as cloning it directly into source and modifying the wscript file (as described in the quic repository's README).

What am I missing/doing wrong?

You can replicate this by running the following MVE out of the scratch folder:

#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/socket.h"
#include "ns3/quic-socket.h"
#include "ns3/quic-socket-factory.h"

int
main (int argc, char *argv[])
{
  ns3::NodeContainer nodes;
  nodes.Create (1);

  ns3::InternetStackHelper stack;
  stack.Install (nodes);

  ns3::Ptr<ns3::Node> node = nodes.Get(0);

  ns3::TypeId tid = ns3::TypeId::LookupByName ("ns3::QuicSocketFactory");

  ns3::Ptr<ns3::Socket> m_socket = 0;
  m_socket = ns3::Socket::CreateSocket (node, tid);

  ns3::Simulator::Run ();
  ns3::Simulator::Destroy ();
  return 0;
}

Quic-variants-comparison

Hello,

I see in the results that you run this examples with NewReno-like. How do you implement this option from the quic-variants comparison?
I read to your paper about the legacy and non legacy option but it is not clear.

Thank you!

Build stopped: subcommand failed

Hi, I was trying to build ns-3 from the ns-3-dev folder, following the README steps when this error appeared:

miguel@tfg:~/tfg_local/ns-3-workspace/ns-allinone-3.37/ns-3.37/src/ns-3-dev$ ./ns3 build
[0/2] Re-checking globbed directories...
[1/916] Building CXX object src/quic/CMakeFiles/libquic-obj.dir/model/quic-l4-protocol.cc.o
FAILED: src/quic/CMakeFiles/libquic-obj.dir/model/quic-l4-protocol.cc.o
...
/home/miguel/tfg_local/ns-3-workspace/ns-allinone-3.37/ns-3.37/src/ns-3-dev/src/quic/model/quic-l4-protocol.cc:775:55: error: ‘const class ns3::Ipv6Header’ has no member named ‘GetSourceAddress’; did you mean ‘ns3::Ipv6Address ns3::Ipv6Header::m_sourceAddress’? (not accessible from this context)
775 | NS_LOG_FUNCTION (this << packet << incomingIpHeader.GetSourceAddress ()
...
home/miguel/tfg_local/ns-3-workspace/ns-allinone-3.37/ns-3.37/src/ns-3-dev/src/quic/model/quic-l4-protocol.cc:776:37: error: ‘const class ns3::Ipv6Header’ has no member named ‘GetDestinationAddress’; did you mean ‘ns3::Ipv6Address ns3::Ipv6Header::m_destinationAddress’? (not accessible from this context)
776 | incomingIpHeader.GetDestinationAddress ());

How can I solve it?
Maybe it's a stupid question, but it's the first time I work with ns3 and QUIC, and I don't know how to handle it yet.

I have installed ns-3.37 and Ubuntu 22.04.2 LTS.

Thank you very much in advance.

Regards,
Miguel.
Captura desde 2023-04-02 14-57-21

No flow when sending a low number of bytes using BulkSend app

Hi,
I am trying to send a specific number of bytes over QUIC using the BulkSend app, but it seems like there is no traffic at all of I set the maximum amount of bytes to be lower than a specific threshold.
for example if I configure the MaxBytes attribute to 64KB (bulkSendHelper.SetAttribute("MaxBytes", UintegerValue(64 * 1024));), I see no traffic at all.
but if I configure it to 1MB for example (bulkSendHelper.SetAttribute("MaxBytes", UintegerValue(1 * 1024 * 1024));), then I can see traffic.

Is there any bug or limitation in the QUIC module? or am I missing something?

Thanks in advance.

quic-variants-comparison and tcp-variants-comparison

Good afternoon,

I have been reading your paper "Extending the ns-3 QUIC Module" as I am doing a project in which I want to replicate the results obtained in that paper.

I have noticed that in section 3.2 Performance evaluation it is described that a dumbbell topology is being used, with a bottleneck link, but when reviewing both codes and comparing them I have observed that in the quic-variants-comparison example this topology is indeed used, but in the tcp-variants-comparison example there is no such bottleneck link.

The quic-variants-comparison file shows that the "sources" nodes correspond to the sender nodes, which connect to the "gateways" node via the "AccessLink" link. On the other hand, the "sinks" nodes correspond to the receiving nodes, which connect to the "gateways" node via the "LocalLink" link. And the two gateways nodes are connected to each other via the "Bottleneck" link, thus creating the dumbbell topology.

In the tcp-variants-comparison file, on the other hand, there is only one "gateways" node, and all the "sources" and "sinks" nodes are connected to it. The "sources" nodes via the "LocalLink" link, and the "sinks" via the "UnReLink" link (whose characteristics correspond to the "Bottleneck" link described in the case of quic).

My question is: has this file been used for such simulations, or has any modification been made to it, or has a different file been used?

In any case, could you please tell me which file has been used if any other file has been used. Or what modifications have been made to it if any?

I attach the pictures of the code described above:

On the left quic-variants-comparison, on the right tcp-variants-comparison:

Captura
Captura2
Captura3

Thank you in advance

Regards,
Miguel

SIGFPE in QuicCongestionControl (DRAFT 10)

With QUIC_VERSION_DRAFT10 or QUIC_VERSION_NS3_IMPL, ns-3 crashes for me through a division by zero (see attached backtrace from lldb).

The source seems to be https://github.com/signetlabdei/quic/blob/master/model/quic-congestion-ops.cc#L235:

tcbd->m_cWnd += tcbd->m_segmentSize * ackedPacket->m_packet->GetSize ()
        / tcbd->m_cWnd;

I'm not 100% sure what the optimal fix would be, maybe just not dividing by tcbd->m_cWnd, if it is 0?:

if (tcbd->m_cWnd > 0) {
    tcbd->m_cWnd += tcbd->m_segmentSize * ackedPacket->m_packet->GetSize ()
            / tcbd->m_cWnd; 
} else {
    tcbd->m_cWnd += tcbd->m_segmentSize * ackedPacket->m_packet->GetSize ();
}

Nondeterministic simulation behavior.

I'm still trying to figure out why I'm seeing a lot of duplicate packets in my simulations that are then dropped by the RX buffer (see #16). While debugging, I found that individual simulation runs start diverging from a certain point, i.e., they become nondeterministic, even when a global seed value is set via ns3::RngSeedManager::SetSeed (seed). This should not be the case.

More interestingly however, is the protocol behavior at the point where the simulation runs diverge, here are the outputs of two such runs:

+7.093431120s 6  [node 6] QuicL4Protocol:ForwardUp(): [INFO ] Receiving packet on UDP socket
+7.093431120s 6 QuicL5Protocol:CreateStream(): [INFO ] Create stream 0
+7.093431120s 6 QuicL5Protocol:CreateStream(): [INFO ] Create the stream with ID 0
+7.093431120s 6 QuicStreamBase:SetMaxStreamData(): [DEBUG] Update max stream data from 0 to 4294967295
+7.093431120s 6 QuicSocketBase:Connect(): [INFO ] CONNECTION not authenticated: cannot perform 0-RTT Handshake
+7.093431120s 6 QuicSocketBase:SetState(): [INFO ] Server LISTENING -> CONNECTING_SVR
+7.093431120s 6 QuicSocketBase:ReceivedData(): [INFO ] Received packet of size 1204
+7.093431120s 6 QuicSocketBase:ReceivedData(): [INFO ] Server receives INITIAL
+7.093431120s 6 QuicL5Protocol:DisgregateRecv(): [INFO ] DisgregateRecv for a packet with size 1204
+7.093431120s 6 QuicL5Protocol:DisgregateRecv(): [INFO ] subheader |STREAM010|
|Stream Id 0|
|Length 1200|
 dataSizeByte 1204 remaining 1200 frame size 1200
+7.093431120s 6 QuicL5Protocol:DisgregateRecv(): [INFO ] fragment size 1200
+7.093431120s 6 QuicL5Protocol:DispatchRecv(): [INFO ] Receiving frame on stream 0 trigger stream
+7.093431120s 6 QuicStreamBase:SetStreamStateRecv(): [INFO ] Client Stream IDLE -> RECV
+7.093431120s 6 QuicStreamBase:Recv(): [INFO ] Received a frame with the correct order of size 1200
+7.093431120s 6 QuicSocketBase:AvailableWindow(): [DEBUG] m_max_data 4294967295 m_tcb->m_cWnd.Get () 0
+7.093431120s 6 QuicSocketBase:BytesInFlight(): [INFO ] Returning calculated bytesInFlight: 0
+7.093431120s 6 QuicSocketBase:AvailableWindow(): [INFO ] InFlight=0, Win=0 availWin=0
+7.093431120s 6 QuicSocketBase:AppendingTx(): [DEBUG] Added packet to the buffer - txBufSize = 5 AvailableWindow = 0 state CONNECTING_SVR
+7.093431120s 6 QuicStreamBase:Recv(): [INFO ] Received handshake Message in Stream 0
+7.093431120s 6 QuicSocketBase:SendInitialHandshake(): [INFO ] Create HANDSHAKE
+7.093431120s 6 QuicL5Protocol:DispatchSend(): [INFO ] Send packet on (specified) stream 0
+7.093431120s 6 QuicStreamBase:SetStreamStateSend(): [INFO ] Client Stream IDLE -> OPEN
+7.093431120s 6 QuicStreamTxBuffer:Add(): [INFO ] Try to append 0 bytes , availSize=10485760
+7.093431120s 6 QuicStreamTxBuffer:Add(): [WARN ] Discarded. Try to insert empty packet.

vs.

+7.093431120s 6  [node 6] QuicL4Protocol:ForwardUp(): [INFO ] Receiving packet on UDP socket
+7.093431120s 6 QuicL5Protocol:CreateStream(): [INFO ] Create stream 0
+7.093431120s 6 QuicL5Protocol:CreateStream(): [INFO ] Create the stream with ID 0
+7.093431120s 6 QuicStreamBase:SetMaxStreamData(): [DEBUG] Update max stream data from 0 to 4294967295
+7.093431120s 6 QuicSocketBase:Connect(): [INFO ] CONNECTION not authenticated: cannot perform 0-RTT Handshake
+7.093431120s 6 QuicSocketBase:SetState(): [INFO ] Server LISTENING -> CONNECTING_SVR
+7.093431120s 6 QuicSocketBase:ReceivedData(): [INFO ] Received packet of size 1204
+7.093431120s 6 QuicSocketBase:ReceivedData(): [INFO ] Server receives INITIAL
+7.093431120s 6 QuicL5Protocol:DisgregateRecv(): [INFO ] DisgregateRecv for a packet with size 1204
+7.093431120s 6 QuicL5Protocol:DisgregateRecv(): [INFO ] subheader |STREAM010|
|Stream Id 0|
|Length 1200|
 dataSizeByte 1204 remaining 1200 frame size 1200
+7.093431120s 6 QuicL5Protocol:DisgregateRecv(): [INFO ] fragment size 1200
+7.093431120s 6 QuicL5Protocol:DispatchRecv(): [INFO ] Receiving frame on stream 0 trigger stream
+7.093431120s 6 QuicStreamBase:SetStreamStateRecv(): [INFO ] Client Stream IDLE -> RECV
+7.093431120s 6 QuicStreamBase:Recv(): [INFO ] Received a frame with the correct order of size 1200
+7.093431120s 6 QuicSocketBase:AvailableWindow(): [DEBUG] m_max_data 4294967295 m_tcb->m_cWnd.Get () 0
+7.093431120s 6 QuicSocketBase:BytesInFlight(): [INFO ] Returning calculated bytesInFlight: 0
+7.093431120s 6 QuicSocketBase:AvailableWindow(): [INFO ] InFlight=0, Win=0 availWin=0
+7.093431120s 6 QuicSocketBase:AppendingTx(): [DEBUG] Added packet to the buffer - txBufSize = 5 AvailableWindow = 0 state CONNECTING_SVR
+7.093431120s 6 QuicStreamBase:Recv(): [INFO ] Received handshake Message in Stream 0
+7.093431120s 6 QuicSocketBase:SendInitialHandshake(): [INFO ] Create HANDSHAKE
+7.093431120s 6 QuicL5Protocol:DispatchSend(): [INFO ] Send packet on (specified) stream 0
+7.093431120s 6 QuicStreamBase:SetStreamStateSend(): [INFO ] Client Stream IDLE -> OPEN
+7.093431120s 6 QuicStreamTxBuffer:Add(): [INFO ] Try to append 104923235 bytes , availSize=10485760
+7.093431120s 6 QuicStreamTxBuffer:Add(): [WARN ] Rejected. Not enough room to buffer packet.

Notably, there is a tremendous difference in the sizes of the initial packets after the handshake (0 vs. 104923235, I'm also seeing other values, such as 1763730810). I just confirmed this to happen on my macOS laptop as well as a Ubuntu Linux machine.

Does anyone have an idea where these differences could come from? As values seem to be random, my intuition is that there may be an uninitialized variable lingering somewhere?

The quic simulation stops at 302s.

I use the last version quic in ns-3.32, when i run the quic-tester, the simulation stoped at 302s. Some information about links: serverApps.Stop (Seconds (400.0)) clientApps.Stop (Seconds (500.0));
Log:

+294.871752002s 0 QuicL5Protocol:DisgregateRecv(): fragment size 0
+294.871752002s 0 QuicSocketRxBuffer:Size(0x55bc1779d8e0)
+294.871752002s 0 QuicL5Protocol:CreateStream(0x55bc17879d80, 3, 2)
+294.871752002s 0 QuicL5Protocol:DispatchRecv(): Receiving frame on stream 0 trigger socket
+302.028264004s 1  [node 1] QuicL4Protocol:SendPacket(0x55bc1778d170, 0x55bc1788ad40)
+302.028264004s 1  [node 1] QuicL4Protocol:SendPacket(): 0x55bc1778d170 sending seq 149 data size 41
+302.028264004s 1  [node 1] QuicL4Protocol:SendPacket(): Sending Packet Through UDP Socket
+302.028264004s 1  [node 1] QuicL4Protocol:UdpSend(0x55bc1778d170, 0x55bc1788c840)
+302.030393604s 0  [node 0] QuicL4Protocol:ForwardUp(0x55bc17776e60)
+302.030393604s 0  [node 0] QuicL4Protocol:ForwardUp(): Receiving packet on UDP socket
+302.030393604s 0  [node 0] QuicL4Protocol:ForwardUp(): 0
+302.030393604s 0  [node 0] QuicL4Protocol:ForwardUp(): 0x55bc17776e60 waking up handler of socket 0x55bc178894d0
+302.030393604s 0  [node 0] QuicL4Protocol:SendPacket(0x55bc17776e60, 0x55bc178894d0)
+302.030393604s 0  [node 0] QuicL4Protocol:SendPacket(): 0x55bc17776e60 sending seq 101 data size 36
+302.030393604s 0  [node 0] QuicL4Protocol:SendPacket(): Sending Packet Through UDP Socket
+302.030393604s 0  [node 0] QuicL4Protocol:UdpSend(0x55bc17776e60, 0x55bc17889b30)
+302.032515204s 1  [node 1] QuicL4Protocol:ForwardUp(0x55bc1778d170)
+302.032515204s 1  [node 1] QuicL4Protocol:ForwardUp(): Receiving packet on UDP socket
+302.032515204s 1  [node 1] QuicL4Protocol:ForwardUp(): 0
+302.032515204s 1  [node 1] QuicL4Protocol:ForwardUp(): 0x55bc1778d170 waking up handler of socket 0x55bc1788ad40
+302.071752002s 0 QuicSocketTxScheduler:GetNewSegment(0x55bc17784e70, 1460)
+302.071752002s 0 QuicSocketTxScheduler:GetNewSegment(): Update: remaining App Size 0, object size 0
+302.071752002s 0 QuicL5Protocol:GetMaxData(0x55bc17879d80)
+302.071752002s 0 QuicSocketTxScheduler:GetNewSegment(0x55bc17784e70, 1460)
+302.071752002s 0 QuicSocketTxScheduler:GetNewSegment(): Update: remaining App Size 0, object size 0
+302.071752002s 0 QuicL5Protocol:GetMaxData(0x55bc17879d80)
+392.028264004s 1  [node 1] QuicL4Protocol:RemoveSocket(0x55bc1778d170)
+392.028264004s 1 QuicL4Protocol:~QuicUdpBinding(0x55bc1788b160)
+400.000000000s 1 QuicEchoServerApplication:StopApplication(): ##########  QUIC Echo Server STOP at time 400 ##########
+400.000000000s 1 QuicEchoServerApplication:StopApplication(0x55bc17805f80)
+400.000000000s 1  [node 1] QuicL4Protocol:RemoveSocket(0x55bc1778d170)
+400.000000000s 1 QuicL4Protocol:~QuicUdpBinding(0x55bc177a99a0)
+400.000000000s 1  [node 1] QuicL4Protocol:RemoveSocket(): 0x55bc1778d170 Closing all the cloned sockets
+500.000000000s 0 QuicEchoClientApplication:StopApplication(): ##########  QUIC Echo Client STOP at time 500 ##########
+500.000000000s 0 QuicEchoClientApplication:StopApplication(0x55bc17826820)

queston about the tester-streams

Hello sir
I am trying to build a quic stream system model. And I planned to revise the
quic-tester-stream.cc file at first. However, when i trace this file
in wireshark, I found that the packts are sent from the client to the
server and the ack packet from server to client side is not available

Because I did not really change this default file, so I was thinking
whether it is because my ns 3 set up or some nodes setting up problem
in this file?
sincerely

Enabling 0-RTT feature

Hi there,

I am trying to enable 0-RTT feature of QUIC and I am using this command:

Config::SetDefault ("ns3::QuicL4Protocol::0RTT-Handshake", BooleanValue (true));
However, I get this error:
aborted. cond="!IsVersionSupported (m_vers)", msg="0RTT Handshake requested with wrong Initial Version", file=../src/quic/model/quic-socket-base.cc, line=2530
terminate called without an active exception

Could anyone please help me to solve this problem?

Thanks

echoServer’ was not declared in this scope

Hi,

Recently, I have installed NS-3-dev and I cloned quic module into contrib folder.
When I am trying to use ./waf --run to run the .cc files after copying
them into the scratch folder only quic-variants-comparison-bulksend.cc
file works and the others fail to be performed. For example, when I am
trying to run quic-tester.cc file I get this error:
/scratch/quic-tester.cc:99:37: error: ‘echoServer’ was not declared in
this scope
Would you please help me to solve this problem?
Many Thanks

Any idea to implement BBR statemachine?

Hi, there!

Thank you for implementing the detailed module of quic in ns-3. Although in the current quic IETF draft-25 the default congestion control mechanism is mimicking TCP Reno, however, BBR is more attractive because of its theoretical superior. I am willing to contribute to this part and there are some other works in TCP-BBR (https://github.com/mark-claypool/bbr). Could we have a discussion about the implementation here?

Sincerely,
Percy

how to install quic model.

Finally, edit the wscript file of the internet module and add
'model/ipv4-end-point.h',
'model/ipv4-end-point-demux.h',
'model/ipv6-end-point.h',
'model/ipv6-end-point-demux.h',
to the headers.source list

when I do this, it goes wrong, print out "source ns3 header file model/ipv6-end-point.h not found"
what can i do to solve the problem.

No flow when BulkSend app starts at time=0

Hi,
I have noticed a strange behavior when setting up the BulkSend application to start sending at time=0, but works well if I set it to start at time=2 seconds, or even 0.01 seconds.
Why is that happening? and is there a way to solve it?
Attaching the relevant code, in case it is needed:

// Create and configure a QUIC BulkSendApplication and install it on the QUIC server's node:
    Address remoteAddr(InetSocketAddress(ueIpIface.GetAddress(0), dlPort));
    BulkSendHelper bulkSendHelper("ns3::QuicSocketFactory", remoteAddr);
    bulkSendHelper.SetAttribute("MaxBytes", UintegerValue(calculatedFileSize));
    bulkSendHelper.SetAttribute("SendSize", UintegerValue(512));
    ApplicationContainer sourceApps = bulkSendHelper.Install(remoteHost);
    sourceApps.Start(Seconds(0.01)); ** THE PROBLEM IS HERE, IF SET TO BE 0, THEN I SEE NO FLOW AT ALL **
    sourceApps.Stop(Seconds(simulationDuration));

    // Create and configure a QUIC PacketSinkApplication and install it on 'UE-0':
    PacketSinkHelper PacketSinkHelper("ns3::QuicSocketFactory", InetSocketAddress(Ipv4Address::GetAny(), dlPort));
    PacketSinkHelper.SetAttribute("Protocol", TypeIdValue(QuicSocketFactory::GetTypeId()));
    ApplicationContainer sinkApps = PacketSinkHelper.Install(ueNodes.Get(0));
    sinkApps.Start(Seconds(0));
    sinkApps.Stop(Seconds(simulationDuration));

Thanks!

BBR Not working

Tried to install the standalone module to test BBR - didn't work. Now I notice that BBR is not available in quic-ns-3. Any info on this?

Integration in ns3 filr

I want to integrate Quic in ns3 project. So anyone can help me that how can I integrate Quic in the another ns3 file. The ns3 project link is given below where I want to integrate this. Please anyone have any knowledge about that please help me out. The link is as ; https://github.com/hansomesong/ns3-lisp.

Hoping for positive response.
Thanx

QUIC-Variants-Comparison CWND measurements

I'm running the provided examples to test how congestion control algorithms affect QUIC's behaviour.

However, when running the provided example for quic-variants-comparison or bulksend, the resulting clientQUIC-cwnd-change file only contains values for times up to 6.15985 seconds, despite the simulation running for up to 180 seconds.

The corresponding serverQUIC-cwnd-change, serverQUIC-rtt and serverQUIC-rwnd files are empty.

Please advise :) Any help highly appreciated.

Build issue

I clone quic repository and copy quic application and then when I try to build the file they show me error as shown in the attachment
qui
file.

Quic does not works in Wireless environment

Although I have not received any response from the developer of the QUIC model for my previous queries. I have no choice but to ask here again.

The quick model is not working in a WiFi environment. I have a wifi client that sends quic traffic to a wired server but none of the packets are received and finally, the simulation ends with the error msg= sending in statIDLE.

Any help?

Unable to trace RTT of QuicSocketBase

Hi,
I am trying to transplant the quic module to another ns-3 project named mmWave.

Althought the RTT of QuicSocketBase can be traced when the datarate of MyApp is set as 1Mbps or smaller, there comes the problem when I tried to increase the datarate to 2Mbps or even larger. Both the output of Rx and RTT stops to print.

Since I can trace RTT of TcpSocketBase, I guess something goes wrong when I combined the quic module with mmWave.

Any clue about this problem?

Regards,
Kent

Multistreaming using BulkSend

Hi,
I was wondering if it possible to use multiple streams within one QUIC connection using the BulkSend application. I could not find a relevant example about that.

If not, then I'd appreciate any help of how to set up more than one stream within one connection, and to continuously send unlimited data from the source to the destination over all stream concurrently.
It was noted in a closed issue (#42) that the quic-tester-streams shows how to send a packet on a stream, but I couldn't actually understand how it's done there, and is it possible to continuously send unlimited data (not just one packet)?
I don't have the permission to re-open that issue, so I'm opening this one.

Thanks! :)

streams

hello , is there any option or attribute to change the number of streams while using quic protocol?
thanks in advance.

BulkSending with QUIC to a PacketSink over a two-hop lossy link doesn't recognize maxBytes

I'm trying to simulate a two-hop loss link transmission for a fixed number of bytes using QUIC, and compare it with using TCP. I use the BulkSendApplication to send to PacketSink. I wrote a script (as attached) following the ideas from quic-variants-comparison-bulksend.cc. However, I found that the transmission won't stop after the maxBytes of bytes are sent, whereas it works as expected if I use TCP socket. I had to add Simulator::Stop () in the SinkRx trace to break out the transmission.

Can anyone please help me understand what is happening?

lossy-two-hop-quic.txt

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.