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/sixlowpan-net-device.h"
39 #include "ns3/internet-stack-helper.h"
40 #include "ns3/icmpv6-l4-protocol.h"
44 #include <netinet/in.h>
63 virtual void DoRun (
void);
74 void HandleReadIcmpClient (
Ipv6Address icmpSource, uint8_t icmpTtl, uint8_t icmpType,
75 uint8_t icmpCode,uint32_t icmpInfo);
77 void SetFill (uint8_t *fill, uint32_t fillSize, uint32_t dataSize);
84 :
TestCase (
"Verify the 6LoWPAN protocol fragmentation and reassembly")
111 TypeId tid = TypeId::LookupByName (
"ns3::UdpSocketFactory");
126 while ((packet = socket->
RecvFrom (from)))
128 if (Inet6SocketAddress::IsMatchingType (from))
144 TypeId tid = TypeId::LookupByName (
"ns3::UdpSocketFactory");
160 while ((packet = socket->
RecvFrom (from)))
162 if (Inet6SocketAddress::IsMatchingType (from))
171 uint8_t icmpTtl, uint8_t icmpType,
172 uint8_t icmpCode, uint32_t icmpInfo)
184 m_data =
new uint8_t [dataSize];
188 if (fillSize >= dataSize)
190 memcpy (
m_data, fill, dataSize);
195 while (filled + fillSize < dataSize)
197 memcpy (&
m_data[filled], fill, fillSize);
201 memcpy (&
m_data[filled], fill, dataSize - filled);
215 p = Create<Packet> (
m_size);
228 Packet::EnablePrinting ();
231 Ptr<Node> serverNode = CreateObject<Node> ();
239 serverDev = CreateObject<SimpleNetDevice> ();
240 serverDev->
SetAddress (Mac48Address::ConvertFrom (Mac48Address::Allocate ()));
243 serverDevErrorModel->
Disable ();
256 ipv6->
SetUp (netdev_idx);
262 Ptr<Node> clientNode = CreateObject<Node> ();
270 clientDev = CreateObject<SimpleNetDevice> ();
271 clientDev->
SetAddress (Mac48Address::ConvertFrom (Mac48Address::Allocate ()));
274 clientDevErrorModel->
Disable ();
287 ipv6->
SetUp (netdev_idx);
298 uint32_t packetSizes[5] = {200, 300, 400, 500, 600};
301 uint8_t fillData[78];
302 for ( uint32_t k = 48; k <= 125; k++ )
304 fillData[k - 48] = k;
308 for (
int i = 0; i < 5; i++)
312 SetFill (fillData, 78, packetSize);
319 uint8_t recvBuffer[65000];
324 "Packet size not correct: recvSize: " << recvSize <<
" packetSizes[" << i <<
"]: " << packetSizes[i] );
328 0,
"Packet content differs");
335 for (
int i = 0; i < 5; i++)
339 SetFill (fillData, 78, packetSize);
346 uint8_t recvBuffer[65000];
351 "Packet size not correct: recvSize: " << recvSize <<
" packetSizes[" << i <<
"]: " << packetSizes[i] );
355 0,
"Packet content differs");
363 for (
int i = 1; i < 5; i++)
367 SetFill (fillData, 78, packetSize);
370 serverDevErrorModel->
Reset ();
379 uint8_t recvBuffer[65000];
384 "Packet size not correct: recvSize: " << recvSize <<
" packetSizes[" << i <<
"]: " << packetSizes[i] );
388 0,
"Packet content differs");
396 clientDevErrorModel->
Disable ();
397 serverDevErrorModel->
Enable ();
398 for (
int i = 1; i < 5; i++)
402 SetFill (fillData, 78, packetSize);
405 serverDevErrorModel->
Reset ();
422 Simulator::Destroy ();
AttributeValue implementation for Boolean.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Access to the IPv6 forwarding table, interfaces, and configuration.
SixlowpanFragmentationTestSuite()
IPv6 address associated with an interface.
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).
Ptr< Packet > m_sentPacketClient
Ptr< Socket > m_socketClient
void SetNetDevice(Ptr< NetDevice > device)
Setup SixLowPan to be a proxy for the specified NetDevice.
Ptr< Packet > m_receivedPacketServer
a polymophic address class
AttributeValue implementation for 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.
void AddTestCase(TestCase *testCase, enum TestDuration duration)
Add an individual child TestCase to this test suite.
virtual bool SetMtu(const uint16_t mtu)
void SetIpv4StackInstall(bool enable)
Enable/disable IPv4 stack install.
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.
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 Install(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
void SetReceiveErrorModel(Ptr< ErrorModel > em)
Attach a receive ErrorModel to the SimpleNetDevice.
void HandleReadServer(Ptr< Socket > socket)
virtual uint32_t AddInterface(Ptr< NetDevice > device)=0
Add a NetDevice interface.
void StartServer(Ptr< Node > ServerNode)
void HandleReadClient(Ptr< Socket > socket)
Describes an IPv6 address.
SixlowpanFragmentationTestSuite g_sixlowpanFragmentationTestSuite
uint32_t AddDevice(Ptr< NetDevice > device)
Associate a NetDevice to this node.
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.
Time Seconds(double value)
Construct a Time in the indicated unit.
void RemoveAllByteTags(void)
Remove all byte tags stored in this packet.
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.
static const uint32_t packetSize
~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.
void SetChannel(Ptr< SimpleChannel > channel)
Attach a channel to this net device.
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
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.