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);
260 Packet::EnablePrinting ();
263 Ptr<Node> serverNode = CreateObject<Node> ();
271 serverDev = CreateObject<SimpleNetDevice> ();
272 serverDev->
SetAddress (Mac48Address::ConvertFrom (Mac48Address::Allocate ()));
275 serverDevErrorModel->
Disable ();
288 ipv6->
SetUp (netdev_idx);
294 Ptr<Node> clientNode = CreateObject<Node> ();
302 clientDev = CreateObject<SimpleNetDevice> ();
303 clientDev->
SetAddress (Mac48Address::ConvertFrom (Mac48Address::Allocate ()));
306 clientDevErrorModel->
Disable ();
319 ipv6->
SetUp (netdev_idx);
330 uint32_t packetSizes[5] = {200, 300, 400, 500, 600};
333 uint8_t fillData[78];
334 for ( uint32_t k = 48; k <= 125; k++ )
336 fillData[k - 48] = k;
340 for (
int i = 0; i < 5; i++)
344 SetFill (fillData, 78, packetSize);
351 uint8_t recvBuffer[65000];
356 "Packet size not correct: recvSize: " << recvSize <<
" packetSizes[" << i <<
"]: " << packetSizes[i] );
360 0,
"Packet content differs");
367 for (
int i = 0; i < 5; i++)
371 SetFill (fillData, 78, packetSize);
378 uint8_t recvBuffer[65000];
383 "Packet size not correct: recvSize: " << recvSize <<
" packetSizes[" << i <<
"]: " << packetSizes[i] );
387 0,
"Packet content differs");
395 for (
int i = 1; i < 5; i++)
399 SetFill (fillData, 78, packetSize);
402 serverDevErrorModel->
Reset ();
411 uint8_t recvBuffer[65000];
416 "Packet size not correct: recvSize: " << recvSize <<
" packetSizes[" << i <<
"]: " << packetSizes[i] );
420 0,
"Packet content differs");
428 clientDevErrorModel->
Disable ();
429 serverDevErrorModel->
Enable ();
430 for (
int i = 1; i < 5; i++)
434 SetFill (fillData, 78, packetSize);
437 serverDevErrorModel->
Reset ();
454 Simulator::Destroy ();
AttributeValue implementation for Boolean.
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).
This test suite implements a Unit Test.
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 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 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)
Aggregate two Objects together.
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.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Ptr< Socket > m_socketServer
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)
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)
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.
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.
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)
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)
Set a single attribute, raising fatal errors if unsuccessful.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
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.