25 #include "ns3/config.h" 
   26 #include "ns3/uinteger.h" 
   27 #include "ns3/socket-factory.h" 
   28 #include "ns3/ipv4-raw-socket-factory.h" 
   29 #include "ns3/udp-socket-factory.h" 
   30 #include "ns3/simulator.h" 
   31 #include "ns3/simple-net-device.h" 
   32 #include "ns3/simple-net-device-helper.h" 
   33 #include "ns3/socket.h" 
   34 #include "ns3/udp-socket.h" 
   38 #include "ns3/inet-socket-address.h" 
   39 #include "ns3/boolean.h" 
   41 #include "ns3/arp-l3-protocol.h" 
   42 #include "ns3/ipv4-l3-protocol.h" 
   43 #include "ns3/icmpv4-l4-protocol.h" 
   44 #include "ns3/ipv4-list-routing.h" 
   45 #include "ns3/ipv4-static-routing.h" 
   46 #include "ns3/udp-l4-protocol.h" 
   47 #include "ns3/internet-stack-helper.h" 
   48 #include "ns3/error-channel.h" 
   52 #include <netinet/in.h> 
   80   virtual void Print (std::ostream &os)
 const { os << 
"token=" << token; }
 
   85   void SetToken (uint64_t token) { this->token = token; }
 
  114   virtual void DoRun (
void);
 
  151   void HandleReadIcmpClient (
Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType,
 
  152                              uint8_t icmpCode, uint32_t icmpInfo);
 
  160   void SetFill (uint8_t *fill, uint32_t fillSize, uint32_t dataSize);
 
  171   : 
TestCase (
"Verify the IPv4 layer 3 protocol fragmentation and reassembly")
 
  197       TypeId tid = TypeId::LookupByName (
"ns3::UdpSocketFactory");
 
  217   while ((packet = socket->
RecvFrom (from)))
 
  219       if (InetSocketAddress::IsMatchingType (from))
 
  232       TypeId tid = TypeId::LookupByName (
"ns3::UdpSocketFactory");
 
  248   while ((packet = socket->
RecvFrom (from)))
 
  250       if (InetSocketAddress::IsMatchingType (from))
 
  259                                              uint8_t icmpTtl, uint8_t icmpType,
 
  260                                              uint8_t icmpCode, uint32_t icmpInfo)
 
  271       m_data = 
new uint8_t [dataSize];
 
  275   if (fillSize >= dataSize)
 
  277       memcpy (
m_data, fill, dataSize);
 
  282   while (filled + fillSize < dataSize)
 
  284       memcpy (&
m_data[filled], fill, fillSize);
 
  288   memcpy(&
m_data[filled], fill, dataSize - filled);
 
  302       p = Create<Packet> (
m_size);
 
  324   Ptr<Node> serverNode = CreateObject<Node> ();
 
  326   Ptr<Node> clientNode = CreateObject<Node> ();
 
  349   ipv4->
SetUp (netdev_idx);
 
  352   serverDevErrorModel->
Disable ();
 
  353   serverDev->SetMtu(1500);
 
  354   serverDev->SetReceiveErrorModel (serverDevErrorModel);
 
  362   ipv4->
SetUp (netdev_idx);
 
  365   clientDevErrorModel->
Disable ();
 
  366   clientDev->SetMtu(1500);
 
  367   clientDev->SetReceiveErrorModel (clientDevErrorModel);
 
  371   uint32_t packetSizes[5] = {1000, 2000, 5000, 10000, 65000};
 
  374   uint8_t fillData[78];
 
  375   for ( uint32_t k=48; k<=125; k++ )
 
  381   for( 
int i= 0; i<5; i++)
 
  385       SetFill (fillData, 78, packetSize);
 
  392       uint8_t recvBuffer[65000];
 
  400                              0, 
"Packet content differs");
 
  407   for( 
int i= 0; i<5; i++)
 
  411       SetFill (fillData, 78, packetSize);
 
  418       uint8_t recvBuffer[65000];
 
  426                              0, 
"Packet content differs");
 
  437   clientDevErrorModel->
Disable();
 
  438   serverDevErrorModel->
Enable();
 
  439   for( 
int i= 1; i<5; i++)
 
  443       SetFill (fillData, 78, packetSize);
 
  446       serverDevErrorModel->
Reset();
 
  462   clientDevErrorModel->
Disable ();
 
  463   serverDevErrorModel->
Disable ();
 
  464   for (
int i= 0; i<5; i++)
 
  468       SetFill (fillData, 78, packetSize);
 
  484       uint32_t tagStart = 0;
 
  486       while (iter.HasNext ())
 
  511   Simulator::Destroy ();
 
virtual uint32_t GetSerializedSize() const 
 
virtual uint32_t AddInterface(Ptr< NetDevice > device)=0
 
uint64_t GetToken()
Get the token. 
 
void StartClient(Ptr< Node > ClientNode)
Start the client. 
 
NetDeviceContainer Install(Ptr< Node > node) const 
This method creates an ns3::SimpleChannel with the attributes configured by SimpleNetDeviceHelper::Se...
 
Ptr< T > GetObject(void) const 
Get a pointer to the requested aggregated Object. 
 
void WriteU64(uint64_t v)
 
Ptr< NetDevice > Get(uint32_t i) const 
Get the Ptr stored in this container at a given index. 
 
a class to represent an Ipv4 address mask 
 
void AddPacketTag(const Tag &tag) const 
Add a packet tag. 
 
Ptr< Packet > m_sentPacketClient
Packet sent by client. 
 
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. 
 
uint32_t GetSize(void) const 
Returns the the size in bytes of the packet (including the zero-filled initial payload). 
 
static TypeId GetTypeId()
Get the type ID. 
 
Ptr< Socket > m_socketServer
Server socket. 
 
IPv4 Fragmentation TestSuite. 
 
uint8_t m_icmpType
ICMP type. 
 
A sockets interface to UDP. 
 
a polymophic address class 
 
Callback< ObjectBase * > GetConstructor(void) const 
Get the constructor callback. 
 
AttributeValue implementation for Callback. 
 
Ptr< Socket > m_socketClient
Client socket. 
 
Ptr< Packet > SendClient(void)
Send a packet. 
 
Tag used in IPv4 Fragmentation Test. 
 
bool PeekPacketTag(Tag &tag) const 
Search a matching tag and call Tag::Deserialize if it is found. 
 
Identifies a byte tag and a set of bytes within a packet to which the tag applies. 
 
virtual int MulticastJoinGroup(uint32_t interface, const Address &groupAddress)=0
Corresponds to socket option MCAST_JOIN_GROUP. 
 
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite. 
 
virtual void Deserialize(TagBuffer buffer)
 
virtual void SetUp(uint32_t interface)=0
 
Hold an unsigned integer type. 
 
holds a vector of ns3::NetDevice pointers 
 
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
 
ByteTagIterator GetByteTagIterator(void) const 
Returns an iterator over the set of byte tags included in this packet. 
 
void SetRecvCallback(Callback< void, Ptr< Socket > >)
Notify application when new data is available to be read. 
 
uint32_t GetEnd(void) const 
The index is an offset from the start of the packet. 
 
static Ipv4FragmentationTestSuite g_ipv4fragmentationTestSuite
Static variable for test initialization. 
 
void Disable(void)
Disable the error model. 
 
virtual int Connect(const Address &address)=0
Initiate a connection to a remote host. 
 
void SetJumpingMode(bool mode)
Set if the odd packets are delayed (even ones are not delayed ever) 
 
Access to the IPv4 forwarding table, interfaces, and configuration. 
 
virtual void Serialize(TagBuffer buffer) const 
 
Ptr< Packet > Copy(void) const 
performs a COW copy of the packet. 
 
tag a set of bytes in a packet 
 
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket. 
 
Every class exported by the ns3 library is enclosed in the ns3 namespace. 
 
keep track of a set of node pointers. 
 
void SetNetDevicePointToPointMode(bool pointToPointMode)
SimpleNetDevice is Broadcast capable and ARP needing. 
 
Iterator over the set of byte tags in a packet. 
 
void Install(std::string nodeName) const 
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
 
void Reset(void)
Reset any state associated with the error model. 
 
#define NS_TEST_EXPECT_MSG_NE(actual, limit, msg)
Test that an actual and expected (limit) value are not equal and report if not. 
 
std::string GetName(void) const 
Get the name. 
 
virtual void Print(std::ostream &os) const 
 
TypeId GetTypeId(void) const 
 
void HandleReadIcmpClient(Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo)
Handle incoming ICMP packets. 
 
virtual TypeId GetInstanceTypeId() const 
Get the most derived TypeId for this Object. 
 
void GetTag(Tag &tag) const 
Read the requested tag and store it in the user-provided tag instance. 
 
uint32_t m_dataSize
Data size. 
 
void StartServer(Ptr< Node > ServerNode)
Start the server. 
 
Ipv4 addresses are stored in host order in this class. 
 
uint32_t GetStart(void) const 
The index is an offset from the start of the packet. 
 
uint32_t GetId(void) const 
 
a class to store IPv4 address information on an interface 
 
virtual Ptr< Node > GetNode(void) const =0
Return the node this socket is associated with. 
 
uint32_t m_size
packet size. 
 
Time Seconds(double value)
Construct a Time in the indicated unit. 
 
void SetDefault(std::string name, const AttributeValue &value)
 
void SetToken(uint64_t token)
Set the token. 
 
Ptr< Packet > m_receivedPacketServer
Packet received by server. 
 
uint64_t token
Token carried by the tag. 
 
virtual bool AddAddress(uint32_t interface, Ipv4InterfaceAddress address)=0
 
uint32_t CopyData(uint8_t *buffer, uint32_t size) const 
Copy the packet contents to a byte buffer. 
 
Ptr< Packet > m_receivedPacketClient
Packet received by client. 
 
virtual void DoRun(void)
Implementation to actually run this TestCase. 
 
void SetJumpingTime(Time delay)
Set the delay for the odd packets (even ones are not delayed) 
 
static const uint32_t packetSize
 
virtual Ptr< Packet > RecvFrom(uint32_t maxSize, uint32_t flags, Address &fromAddress)=0
Read a single packet from the socket and retrieve the sender address. 
 
build a set of SimpleNetDevice objects 
 
virtual int Send(Ptr< Packet > p, uint32_t flags)=0
Send data (or dummy data) to the remote host. 
 
Ipv4FragmentationTestSuite()
 
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful. 
 
a unique identifier for an interface. 
 
TypeId SetParent(TypeId tid)
Set the parent TypeId. 
 
void Enable(void)
Enable the error model. 
 
void SetFill(uint8_t *fill, uint32_t fillSize, uint32_t dataSize)
Set the packet fill. 
 
void HandleReadClient(Ptr< Socket > socket)
Handle incoming packets. 
 
void AddByteTag(const Tag &tag) const 
Tag each byte included in this packet with a new byte tag. 
 
void HandleReadServer(Ptr< Socket > socket)
Handle incoming packets.