27#include "ns3/config.h" 
   28#include "ns3/uinteger.h" 
   29#include "ns3/socket-factory.h" 
   30#include "ns3/ipv4-raw-socket-factory.h" 
   31#include "ns3/ipv6-raw-socket-factory.h" 
   32#include "ns3/udp-socket-factory.h" 
   33#include "ns3/simulator.h" 
   34#include "ns3/simple-net-device.h" 
   35#include "ns3/socket.h" 
   36#include "ns3/udp-socket.h" 
   40#include "ns3/inet-socket-address.h" 
   41#include "ns3/boolean.h" 
   43#include "ns3/ipv6-static-routing.h" 
   44#include "ns3/ipv6-list-routing.h" 
   45#include "ns3/inet6-socket-address.h" 
   47#include "ns3/arp-l3-protocol.h" 
   48#include "ns3/ipv4-l3-protocol.h" 
   49#include "ns3/icmpv4-l4-protocol.h" 
   50#include "ns3/ipv4-list-routing.h" 
   51#include "ns3/ipv4-static-routing.h" 
   52#include "ns3/udp-l4-protocol.h" 
   54#include "ns3/ipv6-l3-protocol.h" 
   55#include "ns3/icmpv6-l4-protocol.h" 
   56#include "ns3/traffic-control-layer.h" 
   57#include "ns3/internet-stack-helper.h" 
   58#include "ns3/error-channel.h" 
   62#include <netinet/in.h> 
   90  virtual void Print (std::ostream &os)
 const { os << 
"token=" << 
token; }
 
  126  virtual void DoRun (
void);
 
  164                             uint8_t icmpCode, 
uint32_t icmpInfo);
 
  203  : 
TestCase (
"Verify the IPv6 layer 3 protocol fragmentation and reassembly")
 
  230      TypeId tid = TypeId::LookupByName (
"ns3::UdpSocketFactory");
 
  245  while ((packet = socket->
RecvFrom (from)))
 
  247      if (Inet6SocketAddress::IsMatchingType (from))
 
  260      TypeId tid = TypeId::LookupByName (
"ns3::UdpSocketFactory");
 
  276  while ((packet = socket->
RecvFrom (from)))
 
  278      if (Inet6SocketAddress::IsMatchingType (from))
 
  287                                             uint8_t icmpTtl, uint8_t icmpType,
 
  288                                             uint8_t icmpCode, 
uint32_t icmpInfo)
 
  300      m_data = 
new uint8_t [dataSize];
 
  304  if (fillSize >= dataSize)
 
  306      memcpy (
m_data, fill, dataSize);
 
  311  while (filled + fillSize < dataSize)
 
  313      memcpy (&
m_data[filled], fill, fillSize);
 
  317  memcpy (&
m_data[filled], fill, dataSize - filled);
 
  331      p = Create<Packet> (
m_size);
 
  362  Ptr<Node> serverNode = CreateObject<Node> ();
 
  367    serverDev = CreateObject<SimpleNetDevice> ();
 
  368    serverDev->SetAddress (Mac48Address::ConvertFrom (Mac48Address::Allocate ()));
 
  369    serverDev->SetMtu (1500);
 
  370    serverDev->SetReceiveErrorModel (serverDevErrorModel);
 
  371    serverDevErrorModel->Disable ();
 
  374    uint32_t netdev_idx = ipv6->AddInterface (serverDev);
 
  376    ipv6->AddAddress (netdev_idx, ipv6Addr);
 
  377    ipv6->SetUp (netdev_idx);
 
  383  Ptr<Node> clientNode = CreateObject<Node> ();
 
  388    clientDev = CreateObject<SimpleNetDevice> ();
 
  389    clientDev->SetAddress (Mac48Address::ConvertFrom (Mac48Address::Allocate ()));
 
  390    clientDev->SetMtu (1500);
 
  391    clientDev->SetReceiveErrorModel (clientDevErrorModel);
 
  392    clientDevErrorModel->Disable ();
 
  395    uint32_t netdev_idx = ipv6->AddInterface (clientDev);
 
  397    ipv6->AddAddress (netdev_idx, ipv6Addr);
 
  398    ipv6->SetUp (netdev_idx);
 
  405  serverDev->SetChannel (
channel);
 
  406  clientDev->SetChannel (
channel);
 
  411  uint32_t packetSizes[5] = {1500, 2000, 5000, 10000, 65000};
 
  414  uint8_t fillData[78];
 
  417      fillData[
k - 48] = 
k;
 
  421  for ( 
int i = 0; i < 5; i++)
 
  432      uint8_t recvBuffer[65000];
 
  437                             "Packet size not correct: recvSize: " << recvSize << 
" packetSizes[" << i << 
"]: " << packetSizes[i] );
 
  441                             0, 
"Packet content differs");
 
  447  channel->SetJumpingMode (
true);
 
  448  for ( 
int i = 0; i < 5; i++)
 
  459      uint8_t recvBuffer[65000];
 
  464                             "Packet size not correct: recvSize: " << recvSize << 
" packetSizes[" << i << 
"]: " << packetSizes[i] );
 
  468                             0, 
"Packet content differs");
 
  470  channel->SetJumpingMode (
false);
 
  479  clientDevErrorModel->Disable ();
 
  480  serverDevErrorModel->Enable ();
 
  481  for ( 
int i = 1; i < 5; i++)
 
  488      serverDevErrorModel->Reset ();
 
  501                             && (
m_icmpCode == Icmpv6Header::ICMPV6_FRAGTIME),
 
  507  clientDevErrorModel->Disable ();
 
  508  serverDevErrorModel->Disable ();
 
  509  for (
int i= 0; i<5; i++)
 
  555  Simulator::Destroy ();
 
Tag used in IPv6 Fragmentation Test.
virtual void Print(std::ostream &os) const
static TypeId GetTypeId()
Get the type ID.
virtual void Serialize(TagBuffer buffer) const
virtual TypeId GetInstanceTypeId() const
Get the most derived TypeId for this Object.
virtual void Deserialize(TagBuffer buffer)
uint64_t GetToken()
Get the token.
virtual uint32_t GetSerializedSize() const
uint64_t token
Token carried by the tag.
void SetToken(uint64_t token)
Set the token.
void HandleReadServer(Ptr< Socket > socket)
Handle incoming packets.
Ptr< Socket > m_socketClient
Client socket.
uint32_t m_dataSize
Data size.
void SetFill(uint8_t *fill, uint32_t fillSize, uint32_t dataSize)
Set the packet fill.
uint8_t m_icmpCode
ICMP code.
void HandleReadIcmpClient(Ipv6Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo)
Handle incoming ICMP packets.
Ptr< Socket > m_socketServer
Server socket.
virtual void DoRun(void)
Implementation to actually run this TestCase.
void StartServer(Ptr< Node > ServerNode)
Start the server.
Ptr< Packet > m_receivedPacketServer
Packet received by server.
Ptr< Packet > m_sentPacketClient
Packet sent by client.
Ptr< Packet > SendClient(void)
Send a packet.
void HandleReadClient(Ptr< Socket > socket)
Handle incoming packets.
void HandleServerRx(Ptr< const Packet > packet, Ptr< Ipv6 > ipv6, uint32_t interface)
Handle Server's incoming packets.
void HandleClientTx(Ptr< const Packet > packet, Ptr< Ipv6 > ipv6, uint32_t interface)
Handle Client's transmitting packets.
uint8_t m_icmpType
ICMP type.
uint32_t m_size
packet size.
Ptr< Packet > m_receivedPacketClient
Packet received by client.
void StartClient(Ptr< Node > ClientNode)
Start the client.
IPv6 Fragmentation TestSuite.
Ipv6FragmentationTestSuite()
a polymophic address class
Identifies a byte tag and a set of bytes within a packet to which the tag applies.
uint32_t GetEnd(void) const
The index is an offset from the start of the packet.
TypeId GetTypeId(void) const
void GetTag(Tag &tag) const
Read the requested tag and store it in the user-provided tag instance.
uint32_t GetStart(void) const
The index is an offset from the start of the packet.
Iterator over the set of byte tags in a packet.
AttributeValue implementation for Callback.
aggregate IP/TCP/UDP functionality to existing Nodes.
void SetIpv4StackInstall(bool enable)
Enable/disable IPv4 stack install.
void Install(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
Describes an IPv6 address.
Access to the IPv6 forwarding table, interfaces, and configuration.
IPv6 address associated with an interface.
Describes an IPv6 prefix.
uint32_t GetId(void) const
uint32_t AddDevice(Ptr< NetDevice > device)
Associate a NetDevice to this node.
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
uint32_t CopyData(uint8_t *buffer, uint32_t size) const
Copy the packet contents to a byte buffer.
ByteTagIterator GetByteTagIterator(void) const
Returns an iterator over the set of byte tags included in this packet.
void AddPacketTag(const Tag &tag) const
Add a packet tag.
void AddByteTag(const Tag &tag) const
Tag each byte included in this packet with a new byte tag.
bool PeekPacketTag(Tag &tag) const
Search a matching tag and call Tag::Deserialize if it is found.
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
virtual int Send(Ptr< Packet > p, uint32_t flags)=0
Send data (or dummy data) to the remote host.
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.
virtual Ptr< Node > GetNode(void) const =0
Return the node this socket is associated with.
virtual int Connect(const Address &address)=0
Initiate a connection to a remote host.
void SetRecvCallback(Callback< void, Ptr< Socket > > receivedData)
Notify application when new data is available to be read.
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
void WriteU64(uint64_t v)
tag a set of bytes in a packet
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
@ UNIT
This test suite implements a Unit Test.
a unique identifier for an interface.
Callback< ObjectBase * > GetConstructor(void) const
Get the constructor callback.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
std::string GetName(void) const
Get the name.
A sockets interface to UDP.
#define NS_TEST_EXPECT_MSG_LT_OR_EQ(actual, limit, msg)
Test that an actual value is less than or equal to a limit and report if not.
#define NS_TEST_EXPECT_MSG_NE(actual, limit, msg)
Test that an actual and expected (limit) value are not equal and report if not.
#define NS_TEST_EXPECT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report if not.
Time Seconds(double value)
Construct a Time in the indicated unit.
static Ipv6FragmentationTestSuite g_ipv6fragmentationTestSuite
Static variable for test initialization.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
static const uint32_t packetSize
Pcket size generated at the AP.