24 #include <ns3/config.h>    26 #include <ns3/nstime.h>    27 #include <ns3/integer.h>    29 #include <ns3/simple-channel.h>    31 #include <ns3/packet.h>    32 #include <ns3/mac48-address.h>    33 #include <ns3/simple-net-device.h>    34 #include <ns3/error-model.h>    35 #include <ns3/ipv4-address-helper.h>    36 #include <ns3/ipv6-address-helper.h>    37 #include <ns3/internet-stack-helper.h>    38 #include <ns3/tcp-l4-protocol.h>    40 #include <ns3/tcp-congestion-ops.h>    42 #include <ns3/three-gpp-http-client.h>    43 #include <ns3/three-gpp-http-server.h>    44 #include <ns3/three-gpp-http-helper.h>    45 #include <ns3/three-gpp-http-header.h>    47 #include <ns3/basic-data-calculators.h>    93                               const Time        &channelDelay,
   113   virtual void DoRun ();
   114   virtual void DoTeardown ();
   131     void ObjectSent (uint32_t size);
   137     void PartReceived (uint32_t size);
   149     bool ObjectReceived (uint32_t &txSize, uint32_t &rxSize);
   151     bool IsEmpty () 
const;
   153     uint16_t GetNumOfObjectsReceived () 
const;
   200   void ServerMainObjectCallback (uint32_t size);
   219   void ServerEmbeddedObjectCallback (uint32_t size);
   239   void ClientStateTransitionCallback (
const std::string &oldState,
   240                                       const std::string &newState);
   247   void ClientRxDelayCallback (
const Time &delay, 
const Address &from);
   254   void ClientRxRttCallback (
const Time &rtt, 
const Address &from);
   264   void ProgressCallback ();
   298                                                         const Time        &channelDelay,
   305   m_channelDelay (channelDelay),
   308   m_numOfPagesReceived (0),
   309   m_numOfPacketDrops (0)
   362   NS_LOG_DEBUG (
this << 
" node is assigned to " << assignedAddress << 
".");
   413                          "Invalid number of HTTP servers has been installed");
   416                          "HTTP server installation fails to produce a proper type");
   425                          "Invalid number of HTTP clients has been installed");
   428                          "HTTP client installation fails to produce a proper type");
   431   bool traceSourceConnected = httpClient->TraceConnectWithoutContext (
   432       "TxMainObjectRequest",
   436   traceSourceConnected = httpClient->TraceConnectWithoutContext (
   437       "TxEmbeddedObjectRequest",
   441   traceSourceConnected = httpServer->TraceConnectWithoutContext (
   448   traceSourceConnected = httpServer->TraceConnectWithoutContext (
   453   traceSourceConnected = httpClient->TraceConnectWithoutContext (
   454       "RxMainObjectPacket",
   458   traceSourceConnected = httpClient->TraceConnectWithoutContext (
   465   traceSourceConnected = httpServer->TraceConnectWithoutContext (
   471   traceSourceConnected = httpClient->TraceConnectWithoutContext (
   472       "RxEmbeddedObjectPacket",
   477   traceSourceConnected = httpClient->TraceConnectWithoutContext (
   484   traceSourceConnected = httpClient->TraceConnectWithoutContext (
   489   traceSourceConnected = httpClient->TraceConnectWithoutContext (
   494   traceSourceConnected = httpClient->TraceConnectWithoutContext (
   510   NS_LOG_INFO (
this << 
" Total request objects received: "   513   NS_LOG_INFO (
this << 
" Total main objects received: "   516   NS_LOG_INFO (
this << 
" Total embedded objects received: "   527   NS_LOG_INFO (
this << 
" Number of packets dropped by the devices: "   532                          "Unexpected number of web pages processed.");
   534                          "Tracker of request objects detected irrelevant packet(s).");
   536                          "Tracker of main objects detected irrelevant packet(s).");
   538                          "Tracker of embedded objects detected irrelevant packet(s).");
   540   Simulator::Destroy ();
   552   m_numOfObjectsReceived (0)
   561   m_objectsSize.push_back (size);
   577   if (m_objectsSize.empty ())
   583   txSize = m_objectsSize.front ();
   587   m_objectsSize.pop_front ();
   589   m_numOfObjectsReceived++;
   597   return (m_objectsSize.empty () && (m_rxBuffer == 0));
   603   return m_numOfObjectsReceived;
   630                          "Error finding ThreeGppHttpHeader in a packet received by the server");
   632                          "Request object's client TS is unexpectedly non-positive");
   644                          "Server receives one too many request object");
   646                          "Transmitted size and received size of request object differ");
   673                          "Error finding ThreeGppHttpHeader in a packet received by the server");
   675                          "Invalid content type in the received packet");
   677                          "Main object's client TS is unexpectedly non-positive");
   679                          "Main object's server TS is unexpectedly non-positive");
   684                          "Client receives one too many main object");
   686                          "Transmitted size and received size of main object differ");
   688                          "Actual main object packet size and received size of main object differ");
   715                          "Error finding ThreeGppHttpHeader in a packet received by the server");
   717                          "Invalid content type in the received packet");
   719                          "Embedded object's client TS is unexpectedly non-positive");
   721                          "Embedded object's server TS is unexpectedly non-positive");
   727                          "Client receives one too many embedded object");
   729                          "Transmitted size and received size of embedded object differ");
   731                          "Actual embedded object packet size and received size of embedded object differ");
   736                                                            const std::string &newState)
   740   if (newState == 
"READING")
   813     Time channelDelay[] = {
   818     double bitErrorRate[] = {0.0, 5.0e-6};
   819     uint32_t mtuSize[] = {536, 1460};
   824         for (uint32_t i1 = 0; i1 < 3; i1++)
   826             for (uint32_t i2 = 0; i2 < 2; i2++)
   828                 for (uint32_t i3 = 0; i3 < 2; i3++)
   830                     AddHttpObjectTestCase (run++,
   835                     AddHttpObjectTestCase (run++,
   863                               const Time    &channelDelay,
   868     std::ostringstream name;
   869     name << 
"Run #" << rngRun;
   871     name << 
" ber=" << bitErrorRate;
   872     name << 
" mtu=" << mtuSize;
   887         testDuration = TestCase::EXTENSIVE;
   891         testDuration = TestCase::TAKES_FOREVER;
   896                                                  TcpNewReno::GetTypeId (),
 uint16_t m_numOfPagesReceived
Begins with 0. Simulation stops if this reaches 3. 
holds a vector of ns3::Application pointers. 
void ClientRxDelayCallback(const Time &delay, const Address &from)
Connected with RxDelay trace source of the client. 
Simulation virtual time values and global simulation resolution. 
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
TypeId m_tcpType
TCP algorithm used. 
ApplicationContainer Install(NodeContainer c) const
Install an ThreeGppHttpServer on each node of the input container configured with all the attributes ...
Helper to make it easier to instantiate an ThreeGppHttpClient on a set of nodes. 
uint32_t GetId(void) const
Keep track of a set of IPv6 interfaces. 
holds a vector of std::pair of Ptr<Ipv4> and interface index. 
A test class for running several system tests which validate the web browsing traffic model...
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload). 
Model application which simulates the traffic of a web server. 
a class to represent an Ipv4 address mask 
uint16_t m_numOfPacketDrops
Number of packets dropped because of m_errorModel. 
uint32_t m_rngRun
Determines the set of random values generated. 
ThreeGppHttpObjectTracker()
Creates a new instance with all counters begin at zero. 
static ThreeGppHttpClientServerTestSuite g_httpClientServerTestSuiteInstance
The global instance of the three-gpp-http-client-server system test. 
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit. 
ThreeGppHttpObjectTracker m_mainObjectTracker
Tracker of main objects. 
void AddHttpObjectTestCase(uint32_t rngRun, const Time &channelDelay, double bitErrorRate, uint32_t mtuSize, bool useIpv6)
Creates a test case with the given parameters. 
uint16_t m_numOfObjectsReceived
Number of whole objects that have been received so far. 
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
double getMin() const
Returns the minimum value. 
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name. 
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit. 
Helper to make it easier to instantiate an ThreeGppHttpServer on a set of nodes. 
aggregate IP/TCP/UDP functionality to existing Nodes. 
#define NS_TEST_EXPECT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report if not. 
Ptr< MinMaxAvgTotalCalculator< double > > m_delayCalculator
Keeps statistical information of one-trip delays (in seconds). 
void SetBase(Ipv6Address network, Ipv6Prefix prefix, Ipv6Address base=Ipv6Address("::1"))
Set the base network number, network prefix, and base interface ID. 
void ObjectSent(uint32_t size)
Shall be invoked when a whole object has been transmitted. 
uint32_t m_rxBuffer
The accumulated size (in bytes) of parts of a whole object. 
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO. 
void ClientStateTransitionCallback(const std::string &oldState, const std::string &newState)
Connected with StateTransition trace source of the client. 
void ClientRxRttCallback(const Time &rtt, const Address &from)
Connected with RxRtt trace source of the client. 
virtual void DoTeardown()
Implementation to do any local setup required for this TestCase. 
Ptr< Node > CreateSimpleInternetNode(Ptr< SimpleChannel > channel, Address &assignedAddress)
Creates a Node, complete with a TCP/IP stack and address assignment. 
ThreeGppHttpObjectTracker m_requestObjectTracker
Tracker of request objects. 
ThreeGppHttpObjectTestCase(const std::string &name, uint32_t rngRun, const TypeId &tcpType, const Time &channelDelay, double bitErrorRate, uint32_t mtuSize, bool useIpv6)
a polymophic address class 
TCP socket creation and multiplexing/demultiplexing. 
Ipv6InterfaceContainer Assign(const NetDeviceContainer &c)
Allocate an Ipv6InterfaceContainer with auto-assigned addresses. 
Time m_channelDelay
Time needed by a packet to propagate. 
void ClientRxEmbeddedObjectPacketCallback(Ptr< const Packet > packet)
Connected with RxEmbeddedObjectPacket trace source of the client. 
bool m_useIpv6
Whether to use IPv6 or IPv4. 
double getMax() const
Returns the maximum value. 
A test class which verifies that each HTTP object sent is also received the same size. 
void ClientRxMainObjectPacketCallback(Ptr< const Packet > packet)
Connected with RxMainObjectPacket trace source of the client. 
Ptr< MinMaxAvgTotalCalculator< double > > m_rttCalculator
Keeps statistical information of round-trip delays (in seconds). 
bool ObjectReceived(uint32_t &txSize, uint32_t &rxSize)
Shall be invoked after all parts of a complete object have been received. 
ThreeGppHttpClientServerTestSuite()
Instantiate the test suite. 
ThreeGppHttpObjectTracker m_embeddedObjectTracker
Tracker of embedded objects. 
ApplicationContainer Install(NodeContainer c) const
Install a ThreeGppHttpClient on each node of the input container configured with all the attributes s...
void PartReceived(uint32_t size)
Shall be invoked when an object part has been received. 
  AttributeValue implementation for Time. 
Ptr< RateErrorModel > m_errorModel
Receive error model to be attached to the devices of both directions. 
Ipv6AddressHelper m_ipv6AddressHelper
Assigns IPv6 addresses to the nodes. 
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite. 
Model application which simulates the traffic of a web browser. 
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
InternetStackHelper m_internetStackHelper
Installs TCP/IP stack on the nodes. 
Hold an unsigned integer type. 
uint32_t GetN(void) const
#define NS_TEST_ASSERT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report and abort if not. 
uint16_t GetNumOfObjectsReceived() const
void SetRate(double rate)
holds a vector of ns3::NetDevice pointers 
  AttributeValue implementation for TypeId. 
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
uint32_t GetN(void) const
void ClientRxMainObjectCallback(Ptr< const ThreeGppHttpClient > httpClient, Ptr< const Packet > packet)
Connected with RxMainObject trace source of the client. 
void ClientTxMainObjectRequestCallback(Ptr< const Packet > packet)
Connected with TxMainObjectRequest trace source of the client. 
Ptr< Node > GetNode() const
void ProgressCallback()
Dummy event. 
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object. 
TestDuration
How long the test takes to execute. 
bool TraceConnectWithoutContext(std::string name, const CallbackBase &cb)
Connect a TraceSource to a Callback without a context. 
Every class exported by the ns3 library is enclosed in the ns3 namespace. 
Ptr< Packet > Copy(void) const
performs a COW copy of the packet. 
uint32_t m_mtuSize
Maximum transmission unit (in bytes). 
void ServerRxCallback(Ptr< const Packet > packet, const Address &from)
Connected with Rx trace source of the server. 
void SetReceiveErrorModel(Ptr< ErrorModel > em)
Attach a receive ErrorModel to the SimpleNetDevice. 
void Update(const T i)
Updates all variables of MinMaxAvgTotalCalculator. 
NS_LOG_LOGIC("Net device "<< nd<< " is not bridged")
Ipv6Address GetAddress(uint32_t i, uint32_t j) const
Get the address for the specified index. 
Helper class to auto-assign global IPv6 unicast addresses. 
void Install(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
void SetUnit(enum ErrorUnit error_unit)
Describes an IPv6 address. 
void ClientTxEmbeddedObjectRequestCallback(Ptr< const Packet > packet)
Connected with TxEmbeddedObjectRequest trace source of the client. 
Ipv4 addresses are stored in host order in this class. 
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
std::string GetName(void) const
uint32_t AddDevice(Ptr< NetDevice > device)
Associate a NetDevice to this node. 
void ServerEmbeddedObjectCallback(uint32_t size)
Connected with EmbeddedObject trace source of the server. 
#define NS_TEST_ASSERT_MSG_NE(actual, limit, msg)
Test that an actual and expected (limit) value are not equal and report and abort if not...
void SetGlobal(std::string name, const AttributeValue &value)
int64_t GetMilliSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit. 
bool IsPositive(void) const
std::list< uint32_t > m_objectsSize
Each entry is the size (in bytes) of object transmitted. 
virtual void SetAddress(Address address)
Set the address of this interface. 
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG. 
Time Seconds(double value)
Construct a Time in the indicated unit. 
virtual void DoRun()
Implementation to actually run this TestCase. 
Describes an IPv6 prefix. 
A helper class to make life easier while doing simple IPv4 address assignment in scripts. 
Time Now(void)
create an ns3::Time instance which contains the current simulation time. 
double getMean() const
Returns the mean value. 
#define NS_TEST_ASSERT_MSG_GT(actual, limit, msg)
Test that an actual value is greater than a limit and report and abort if not. 
void ServerMainObjectCallback(uint32_t size)
Connected with MainObject trace source of the server. 
void SetChannel(Ptr< SimpleChannel > channel)
Attach a channel to this net device. 
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful. 
a unique identifier for an interface. 
void ClientRxEmbeddedObjectCallback(Ptr< const ThreeGppHttpClient > httpClient, Ptr< const Packet > packet)
Connected with RxEmbeddedObject trace source of the client. 
Ptr< Application > Get(uint32_t i) const
Get the Ptr<Application> stored in this container at a given index. 
uint32_t GetN(void) const
Get the number of Ptr<Application> stored in this container. 
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address. 
void DeviceDropCallback(Ptr< const Packet > packet)
Connected with PhyRxDrop trace source of both the client's and server's devices. 
Ipv4AddressHelper m_ipv4AddressHelper
Assigns IPv4 addresses to the nodes.