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"
32 #include "ns3/simple-net-device.h"
33 #include "ns3/drop-tail-queue.h"
34 #include "ns3/socket.h"
35 #include "ns3/udp-socket.h"
39 #include "ns3/inet-socket-address.h"
40 #include "ns3/boolean.h"
42 #include "ns3/arp-l3-protocol.h"
43 #include "ns3/ipv4-l3-protocol.h"
44 #include "ns3/icmpv4-l4-protocol.h"
45 #include "ns3/ipv4-list-routing.h"
46 #include "ns3/ipv4-static-routing.h"
47 #include "ns3/udp-l4-protocol.h"
51 #include <netinet/in.h>
72 virtual void Print (std::ostream &os)
const { os <<
"token=" << token; }
73 void setToken (uint64_t token) { this->token = token; }
89 ipv4Routing->AddRoutingProtocol (ipv4staticRouting, 0);
115 virtual void DoRun (
void);
126 void HandleReadIcmpClient (
Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType,
127 uint8_t icmpCode,uint32_t icmpInfo);
129 void SetFill (uint8_t *fill, uint32_t fillSize, uint32_t dataSize);
136 :
TestCase (
"Verify the IPv4 layer 3 protocol fragmentation and reassembly")
160 TypeId tid = TypeId::LookupByName (
"ns3::UdpSocketFactory");
180 while ((packet = socket->
RecvFrom (from)))
182 if (InetSocketAddress::IsMatchingType (from))
195 TypeId tid = TypeId::LookupByName (
"ns3::UdpSocketFactory");
211 while ((packet = socket->
RecvFrom (from)))
213 if (InetSocketAddress::IsMatchingType (from))
222 uint8_t icmpTtl, uint8_t icmpType,
223 uint8_t icmpCode, uint32_t icmpInfo)
234 m_data =
new uint8_t [dataSize];
238 if (fillSize >= dataSize)
240 memcpy (
m_data, fill, dataSize);
245 while (filled + fillSize < dataSize)
247 memcpy (&
m_data[filled], fill, fillSize);
251 memcpy(&
m_data[filled], fill, dataSize - filled);
265 p = Create<Packet> (
m_size);
287 Ptr<Node> serverNode = CreateObject<Node> ();
292 serverDev = CreateObject<SimpleNetDevice> ();
293 serverDev->
SetAddress (Mac48Address::ConvertFrom (Mac48Address::Allocate ()));
296 serverDevErrorModel->
Disable();
302 ipv4->
SetUp (netdev_idx);
307 Ptr<Node> clientNode = CreateObject<Node> ();
312 clientDev = CreateObject<SimpleNetDevice> ();
313 clientDev->
SetAddress (Mac48Address::ConvertFrom (Mac48Address::Allocate ()));
316 clientDevErrorModel->
Disable();
322 ipv4->
SetUp (netdev_idx);
334 uint32_t packetSizes[5] = {1000, 2000, 5000, 10000, 65000};
337 uint8_t fillData[78];
338 for ( uint32_t k=48; k<=125; k++ )
344 for(
int i= 0; i<5; i++)
346 uint32_t packetSize = packetSizes[i];
348 SetFill (fillData, 78, packetSize);
355 uint8_t recvBuffer[65000];
363 0,
"Packet content differs");
370 for(
int i= 0; i<5; i++)
372 uint32_t packetSize = packetSizes[i];
374 SetFill (fillData, 78, packetSize);
381 uint8_t recvBuffer[65000];
389 0,
"Packet content differs");
400 clientDevErrorModel->
Disable();
401 serverDevErrorModel->
Enable();
402 for(
int i= 1; i<5; i++)
404 uint32_t packetSize = packetSizes[i];
406 SetFill (fillData, 78, packetSize);
409 serverDevErrorModel->
Reset();
425 clientDevErrorModel->
Disable ();
426 serverDevErrorModel->
Disable ();
427 for (
int i= 0; i<5; i++)
429 uint32_t packetSize = packetSizes[i];
431 SetFill (fillData, 78, packetSize);
447 uint32_t tagStart = 0;
449 while (iter.HasNext ())
474 Simulator::Destroy ();
virtual uint32_t GetSerializedSize() const
virtual uint32_t AddInterface(Ptr< NetDevice > device)=0
void StartClient(Ptr< Node > ClientNode)
void WriteU64(uint64_t v)
a class to represent an Ipv4 address mask
void AddPacketTag(const Tag &tag) const
Add a packet tag.
Ptr< Packet > m_sentPacketClient
#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()
Ptr< Socket > m_socketServer
A sockets interface to UDP.
void setToken(uint64_t token)
a polymophic address class
Callback< ObjectBase * > GetConstructor(void) const
AttributeValue form of a Callback.
Ptr< Socket > m_socketClient
Ptr< Packet > SendClient(void)
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.
virtual void Deserialize(TagBuffer buffer)
virtual void SetUp(uint32_t interface)=0
Hold an unsigned integer type.
virtual bool SetMtu(const uint16_t mtu)
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
ByteTagIterator GetByteTagIterator(void) const
Retiurns 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.
void Disable(void)
Disable the error model.
void AggregateObject(Ptr< Object > other)
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
void SetDefault(std::string name, const AttributeValue &value)
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
Iterator over the set of byte tags in a packet.
#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
virtual void Print(std::ostream &os) const
void SetReceiveErrorModel(Ptr< ErrorModel > em)
Attach a receive ErrorModel to the SimpleNetDevice.
TypeId GetTypeId(void) const
static void AddInternetStack(Ptr< Node > node)
void AddTestCase(TestCase *testCase) NS_DEPRECATED
Add an individual child TestCase case to this TestCase.
void HandleReadIcmpClient(Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo)
virtual TypeId GetInstanceTypeId() const
void GetTag(Tag &tag) const
Read the requested tag and store it in the user-provided tag instance.
void StartServer(Ptr< Node > ServerNode)
Ipv4 addresses are stored in host order in this class.
Ipv4FragmentationTestSuite g_ipv4fragmentationTestSuite
uint32_t GetStart(void) const
The index is an offset from the start of the packet.
uint32_t AddDevice(Ptr< NetDevice > device)
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.
virtual void SetAddress(Address address)
Set the address of this interface.
Ptr< Packet > m_receivedPacketServer
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
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)
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.
This test suite implements a Unit Test.
virtual int Send(Ptr< Packet > p, uint32_t flags)=0
Send data (or dummy data) to the remote host.
Ipv4FragmentationTestSuite()
void SetChannel(Ptr< SimpleChannel > channel)
Attach a channel to this net device.
void SetAttribute(std::string name, const AttributeValue &value)
Ptr< T > GetObject(void) const
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
void Enable(void)
Enable the error model.
void SetFill(uint8_t *fill, uint32_t fillSize, uint32_t dataSize)
void HandleReadClient(Ptr< Socket > socket)
void AddByteTag(const Tag &tag) const
Tag each byte included in this packet with a new byte tag.
void HandleReadServer(Ptr< Socket > socket)
void SetRoutingProtocol(Ptr< Ipv4RoutingProtocol > routingProtocol)
Register a new routing protocol to be used by this Ipv4 stack.