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++)
392 uint8_t recvBuffer[65000];
400 0,
"Packet content differs");
407 for(
int i= 0; i<5; i++)
418 uint8_t recvBuffer[65000];
426 0,
"Packet content differs");
428 channel->SetJumpingMode(
false);
437 clientDevErrorModel->
Disable();
438 serverDevErrorModel->
Enable();
439 for(
int i= 1; i<5; i++)
446 serverDevErrorModel->
Reset();
462 clientDevErrorModel->
Disable ();
463 serverDevErrorModel->
Disable ();
464 for (
int i= 0; i<5; i++)
484 uint32_t tagStart = 0;
486 while (iter.HasNext ())
511 Simulator::Destroy ();
Callback< ObjectBase * > GetConstructor(void) const
Get the constructor callback.
TypeId GetTypeId(void) const
std::string GetName(void) const
Get the name.
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
virtual uint32_t AddInterface(Ptr< NetDevice > device)=0
uint64_t GetToken()
Get the token.
void StartClient(Ptr< Node > ClientNode)
Start the client.
uint32_t GetId(void) const
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
void WriteU64(uint64_t v)
a class to represent an Ipv4 address mask
Ptr< Packet > m_sentPacketClient
Packet sent by client.
aggregate IP/TCP/UDP functionality to existing Nodes.
uint32_t GetStart(void) const
The index is an offset from the start of the packet.
#define NS_TEST_EXPECT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report if not.
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
AttributeValue implementation for Callback.
Ptr< Socket > m_socketClient
Client socket.
Ptr< Packet > SendClient(void)
Send a packet.
Tag used in IPv4 Fragmentation Test.
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)
void SetRecvCallback(Callback< void, Ptr< Socket > >)
Notify application when new data is available to be read.
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.
Access to the IPv4 forwarding table, interfaces, and configuration.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
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.
virtual void Print(std::ostream &os) const
void SetNetDevicePointToPointMode(bool pointToPointMode)
SimpleNetDevice is Broadcast capable and ARP needing.
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
Iterator over the set of byte tags in a packet.
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.
virtual TypeId GetInstanceTypeId() const
Get the most derived TypeId for this Object.
void HandleReadIcmpClient(Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo)
Handle incoming ICMP packets.
void Install(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
uint32_t GetEnd(void) const
The index is an offset from the start of the packet.
uint32_t m_dataSize
Data size.
void StartServer(Ptr< Node > ServerNode)
Start the server.
virtual void Serialize(TagBuffer buffer) const
Ipv4 addresses are stored in host order in this class.
a class to store IPv4 address information on an interface
void AddPacketTag(const Tag &tag) const
Add a packet tag.
virtual Ptr< Node > GetNode(void) const =0
Return the node this socket is associated with.
uint32_t CopyData(uint8_t *buffer, uint32_t size) const
Copy the packet contents to a byte buffer.
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
Ptr< Packet > m_receivedPacketClient
Packet received by client.
virtual void DoRun(void)
Implementation to actually run this TestCase.
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
bool PeekPacketTag(Tag &tag) const
Search a matching tag and call Tag::Deserialize if it is found.
void GetTag(Tag &tag) const
Read the requested tag and store it in the user-provided tag instance.
virtual int Send(Ptr< Packet > p, uint32_t flags)=0
Send data (or dummy data) to the remote host.
Ipv4FragmentationTestSuite()
NetDeviceContainer Install(Ptr< Node > node) const
This method creates an ns3::SimpleChannel with the attributes configured by SimpleNetDeviceHelper::Se...
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 AddByteTag(const Tag &tag) const
Tag each byte included in this packet with a new byte tag.
void Enable(void)
Enable the error model.
void SetFill(uint8_t *fill, uint32_t fillSize, uint32_t dataSize)
Set the packet fill.
ByteTagIterator GetByteTagIterator(void) const
Returns an iterator over the set of byte tags included in this packet.
void HandleReadClient(Ptr< Socket > socket)
Handle incoming packets.
void HandleReadServer(Ptr< Socket > socket)
Handle incoming packets.
virtual uint32_t GetSerializedSize() const