21 #include "ns3/config.h"
22 #include "ns3/uinteger.h"
23 #include "ns3/socket-factory.h"
24 #include "ns3/ipv6-raw-socket-factory.h"
25 #include "ns3/udp-socket-factory.h"
26 #include "ns3/simulator.h"
28 #include "ns3/simple-net-device.h"
29 #include "ns3/drop-tail-queue.h"
30 #include "ns3/socket.h"
31 #include "ns3/udp-socket.h"
35 #include "ns3/inet-socket-address.h"
36 #include "ns3/boolean.h"
38 #include "ns3/ipv6-static-routing.h"
39 #include "ns3/ipv6-list-routing.h"
40 #include "ns3/inet6-socket-address.h"
41 #include "ns3/sixlowpan-net-device.h"
43 #include "ns3/udp-l4-protocol.h"
45 #include "ns3/ipv6-l3-protocol.h"
46 #include "ns3/icmpv6-l4-protocol.h"
50 #include <netinet/in.h>
66 ipv6Routing->AddRoutingProtocol (ipv6staticRouting, 0);
99 virtual void DoRun (
void);
110 void HandleReadIcmpClient (
Ipv6Address icmpSource, uint8_t icmpTtl, uint8_t icmpType,
111 uint8_t icmpCode,uint32_t icmpInfo);
113 void SetFill (uint8_t *fill, uint32_t fillSize, uint32_t dataSize);
120 :
TestCase (
"Verify the 6LoWPAN protocol fragmentation and reassembly")
144 TypeId tid = TypeId::LookupByName (
"ns3::UdpSocketFactory");
159 while ((packet = socket->
RecvFrom (from)))
161 if (Inet6SocketAddress::IsMatchingType (from))
177 TypeId tid = TypeId::LookupByName (
"ns3::UdpSocketFactory");
193 while ((packet = socket->
RecvFrom (from)))
195 if (Inet6SocketAddress::IsMatchingType (from))
204 uint8_t icmpTtl, uint8_t icmpType,
205 uint8_t icmpCode, uint32_t icmpInfo)
217 m_data =
new uint8_t [dataSize];
221 if (fillSize >= dataSize)
223 memcpy (
m_data, fill, dataSize);
228 while (filled + fillSize < dataSize)
230 memcpy (&
m_data[filled], fill, fillSize);
234 memcpy (&
m_data[filled], fill, dataSize - filled);
248 p = Create<Packet> (
m_size);
261 Ptr<Node> serverNode = CreateObject<Node> ();
266 serverDev = CreateObject<SimpleNetDevice> ();
267 serverDev->
SetAddress (Mac48Address::ConvertFrom (Mac48Address::Allocate ()));
270 serverDevErrorModel->
Disable ();
283 ipv6->
SetUp (netdev_idx);
291 Ptr<Node> clientNode = CreateObject<Node> ();
296 clientDev = CreateObject<SimpleNetDevice> ();
297 clientDev->
SetAddress (Mac48Address::ConvertFrom (Mac48Address::Allocate ()));
300 clientDevErrorModel->
Disable ();
313 ipv6->
SetUp (netdev_idx);
327 uint32_t packetSizes[5] = {200, 300, 400, 500, 600};
330 uint8_t fillData[78];
331 for ( uint32_t k = 48; k <= 125; k++ )
333 fillData[k - 48] = k;
337 for (
int i = 0; i < 5; i++)
339 uint32_t packetSize = packetSizes[i];
341 SetFill (fillData, 78, packetSize);
348 uint8_t recvBuffer[65000];
353 "Packet size not correct: recvSize: " << recvSize <<
" packetSizes[" << i <<
"]: " << packetSizes[i] );
357 0,
"Packet content differs");
364 for (
int i = 0; i < 5; i++)
366 uint32_t packetSize = packetSizes[i];
368 SetFill (fillData, 78, packetSize);
375 uint8_t recvBuffer[65000];
380 "Packet size not correct: recvSize: " << recvSize <<
" packetSizes[" << i <<
"]: " << packetSizes[i] );
384 0,
"Packet content differs");
392 for (
int i = 1; i < 5; i++)
394 uint32_t packetSize = packetSizes[i];
396 SetFill (fillData, 78, packetSize);
399 serverDevErrorModel->
Reset ();
408 uint8_t recvBuffer[65000];
413 "Packet size not correct: recvSize: " << recvSize <<
" packetSizes[" << i <<
"]: " << packetSizes[i] );
417 0,
"Packet content differs");
425 clientDevErrorModel->
Disable ();
426 serverDevErrorModel->
Enable ();
427 for (
int i = 1; i < 5; i++)
429 uint32_t packetSize = packetSizes[i];
431 SetFill (fillData, 78, packetSize);
434 serverDevErrorModel->
Reset ();
451 Simulator::Destroy ();
Access to the IPv6 forwarding table, interfaces, and configuration.
SixlowpanFragmentationTestSuite()
IPv6 address associated with an interface.
#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).
Ptr< Packet > m_sentPacketClient
Ptr< Socket > m_socketClient
void SetNetDevice(Ptr< NetDevice > device)
Setup SixLowPan to be a proxy for the specified NetDevice.
A sockets interface to UDP.
Ptr< Packet > m_receivedPacketServer
a polymophic address class
AttributeValue form of a Callback.
void SetJumpingMode(bool mode)
Set if the odd packets are delayed (even ones are not delayed ever)
void RemoveAllPacketTags(void)
Remove all packet tags.
virtual bool SetMtu(const uint16_t mtu)
void StartClient(Ptr< Node > ClientNode)
An implementation of the ICMPv6 protocol.
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.
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.
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
Ptr< Packet > m_receivedPacketClient
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
Ptr< Socket > m_socketServer
void SetReceiveErrorModel(Ptr< ErrorModel > em)
Attach a receive ErrorModel to the SimpleNetDevice.
void HandleReadServer(Ptr< Socket > socket)
void AddTestCase(TestCase *testCase) NS_DEPRECATED
Add an individual child TestCase case to this TestCase.
virtual uint32_t AddInterface(Ptr< NetDevice > device)=0
Add a NetDevice interface.
void StartServer(Ptr< Node > ServerNode)
virtual void RegisterExtensions()
Register the IPv6 Extensions.
void HandleReadClient(Ptr< Socket > socket)
Describes an IPv6 address.
void SetRoutingProtocol(Ptr< Ipv6RoutingProtocol > routingProtocol)
Set routing protocol for this stack.
SixlowpanFragmentationTestSuite g_sixlowpanFragmentationTestSuite
uint32_t AddDevice(Ptr< NetDevice > device)
uint32_t GetId(void) const
virtual Ptr< Node > GetNode(void) const =0
Return the node this socket is associated with.
Ptr< Packet > SendClient(void)
virtual void SetAddress(Address address)
Set the address of this interface.
void RemoveAllByteTags(void)
Remove all byte tags stored in this packet.
virtual void RegisterOptions()
Register the IPv6 Options.
Describes an IPv6 prefix.
SixlowpanFragmentationTest()
virtual bool AddAddress(uint32_t interface, Ipv6InterfaceAddress address)=0
Add an address on the specified IPv6 interface.
uint32_t CopyData(uint8_t *buffer, uint32_t size) const
Copy the packet contents to a byte buffer.
~SixlowpanFragmentationTest()
void SetDuplicateMode(bool mode)
Set if the odd packets are duplicated (even ones are not duplicated ever)
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.
void HandleReadIcmpClient(Ipv6Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo)
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.
static void AddInternetStack(Ptr< Node > node)
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.
void Enable(void)
Enable the error model.
void SetFill(uint8_t *fill, uint32_t fillSize, uint32_t dataSize)
virtual void SetUp(uint32_t interface)=0
Set the interface into the "up" state.
virtual void DoRun(void)
Implementation to actually run this TestCase.