19#include "ns3/boolean.h"
20#include "ns3/config.h"
21#include "ns3/error-channel.h"
22#include "ns3/icmpv6-l4-protocol.h"
23#include "ns3/inet-socket-address.h"
24#include "ns3/internet-stack-helper.h"
25#include "ns3/ipv6-raw-socket-factory.h"
28#include "ns3/simple-net-device.h"
29#include "ns3/simulator.h"
30#include "ns3/sixlowpan-net-device.h"
31#include "ns3/socket-factory.h"
32#include "ns3/socket.h"
34#include "ns3/udp-socket-factory.h"
35#include "ns3/udp-socket.h"
36#include "ns3/uinteger.h"
39#include "ns3/win32-internet.h"
41#include <netinet/in.h>
69 void DoRun()
override;
126 :
TestCase(
"Verify the 6LoWPAN protocol fragmentation and reassembly")
167 while ((packet = socket->RecvFrom(from)))
171 packet->RemoveAllPacketTags();
172 packet->RemoveAllByteTags();
202 while ((packet = socket->RecvFrom(from)))
228 m_data =
new uint8_t[dataSize];
232 if (fillSize >= dataSize)
234 memcpy(
m_data, fill, dataSize);
239 while (filled + fillSize < dataSize)
241 memcpy(&
m_data[filled], fill, fillSize);
245 memcpy(&
m_data[filled], fill, dataSize - filled);
260 p = Create<Packet>(
m_size);
272 internet.SetIpv4StackInstall(
false);
276 Ptr<Node> serverNode = CreateObject<Node>();
277 internet.Install(serverNode);
284 serverDev = CreateObject<SimpleNetDevice>();
286 serverDev->SetMtu(1500);
287 serverDev->SetReceiveErrorModel(serverDevErrorModel);
288 serverDevErrorModel->Disable();
289 serverNode->AddDevice(serverDev);
292 serverSix->SetAttribute(
"ForceEtherType",
BooleanValue(
true));
293 serverNode->AddDevice(serverSix);
294 serverSix->SetNetDevice(serverDev);
297 ipv6->AddInterface(serverDev);
298 uint32_t netdev_idx = ipv6->AddInterface(serverSix);
301 ipv6->AddAddress(netdev_idx, ipv6Addr);
302 ipv6->SetUp(netdev_idx);
307 Ptr<Node> clientNode = CreateObject<Node>();
308 internet.Install(clientNode);
315 clientDev = CreateObject<SimpleNetDevice>();
317 clientDev->SetMtu(150);
318 clientDev->SetReceiveErrorModel(clientDevErrorModel);
319 clientDevErrorModel->Disable();
320 clientNode->AddDevice(clientDev);
323 clientSix->SetAttribute(
"ForceEtherType",
BooleanValue(
true));
324 clientNode->AddDevice(clientSix);
325 clientSix->SetNetDevice(clientDev);
328 ipv6->AddInterface(clientDev);
329 uint32_t netdev_idx = ipv6->AddInterface(clientSix);
332 ipv6->AddAddress(netdev_idx, ipv6Addr);
333 ipv6->SetUp(netdev_idx);
339 serverDev->SetChannel(channel);
340 clientDev->SetChannel(channel);
343 uint32_t packetSizes[5] = {200, 300, 400, 500, 600};
346 uint8_t fillData[78];
347 for (
uint32_t k = 48; k <= 125; k++)
349 fillData[k - 48] = k;
353 for (
int i = 0; i < 5; i++)
366 uint8_t recvBuffer[65000];
372 "Packet size not correct: recvSize: "
373 << recvSize <<
" packetSizes[" << i <<
"]: " << packetSizes[i]);
378 "Packet content differs");
384 channel->SetJumpingMode(
true);
385 for (
int i = 0; i < 5; i++)
398 uint8_t recvBuffer[65000];
404 "Packet size not correct: recvSize: "
405 << recvSize <<
" packetSizes[" << i <<
"]: " << packetSizes[i]);
410 "Packet content differs");
412 channel->SetJumpingMode(
false);
416 channel->SetDuplicateMode(
true);
417 for (
int i = 1; i < 5; i++)
424 serverDevErrorModel->Reset();
435 uint8_t recvBuffer[65000];
441 "Packet size not correct: recvSize: "
442 << recvSize <<
" packetSizes[" << i <<
"]: " << packetSizes[i]);
447 "Packet content differs");
449 channel->SetDuplicateMode(
false);
454 clientDevErrorModel->Disable();
455 serverDevErrorModel->Enable();
456 for (
int i = 1; i < 5; i++)
463 serverDevErrorModel->Reset();
497 :
TestSuite(
"sixlowpan-fragmentation", UNIT)
6LoWPAN Fragmentation Test
uint8_t m_icmpType
ICMP type.
Ptr< Packet > m_sentPacketClient
Packet sent by client.
void StartClient(Ptr< Node > clientNode)
Start the client node.
void StartServer(Ptr< Node > serverNode)
Start the server node.
Ptr< Socket > m_socketServer
Socket on the server.
Ptr< Socket > m_socketClient
Socket on the client.
~SixlowpanFragmentationTest() override
uint8_t m_icmpCode
ICMP code.
void SetFill(uint8_t *fill, uint32_t fillSize, uint32_t dataSize)
Set the packet optional content.
void HandleReadIcmpClient(Ipv6Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo)
Handles incoming ICMP packets in the client.
Ptr< Packet > m_receivedPacketServer
packet received by the server.
void HandleReadServer(Ptr< Socket > socket)
Handles incoming packets in the server.
SixlowpanFragmentationTest()
uint32_t m_dataSize
Size of the data (if any).
void HandleReadClient(Ptr< Socket > socket)
Handles incoming packets in the client.
Ptr< Packet > SendClient()
Send a packet to the server.
uint32_t m_size
Size of the packet if no data has been provided.
void DoRun() override
Implementation to actually run this TestCase.
Ptr< Packet > m_receivedPacketClient
Packet received by the client.
uint8_t * m_data
Data to be carried in the packet.
6LoWPAN Fragmentation TestSuite
SixlowpanFragmentationTestSuite()
a polymophic address class
AttributeValue implementation for Boolean.
AttributeValue implementation for Callback.
An implementation of the ICMPv6 protocol.
static bool IsMatchingType(const Address &addr)
If the address match.
aggregate IP/TCP/UDP functionality to existing Nodes.
Describes an IPv6 address.
static Ipv6Address GetAny()
Get the "any" (::) Ipv6Address.
Access to the IPv6 forwarding table, interfaces, and configuration.
IPv6 address associated with an interface.
Describes an IPv6 prefix.
static Mac48Address ConvertFrom(const Address &address)
static Mac48Address Allocate()
Allocate a new Mac48Address.
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
uint32_t GetSize() const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
uint32_t CopyData(uint8_t *buffer, uint32_t size) const
Copy the packet contents to a byte buffer.
static void EnablePrinting()
Enable printing packets metadata.
Smart pointer class similar to boost::intrusive_ptr.
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
static void ScheduleWithContext(uint32_t context, const Time &delay, FUNC f, Ts &&... args)
Schedule an event with the given context.
static void Run()
Run the simulation.
virtual int Send(Ptr< Packet > p, uint32_t flags)=0
Send data (or dummy data) to the remote host.
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.
static Ptr< Socket > CreateSocket(Ptr< Node > node, TypeId tid)
This method wraps the creation of sockets that is performed on a given node by a SocketFactory specif...
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
virtual Ptr< Node > GetNode() const =0
Return the node this socket is associated with.
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
a unique identifier for an interface.
static TypeId LookupByName(std::string name)
Get a TypeId by name.
#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.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
static SixlowpanFragmentationTestSuite g_sixlowpanFragmentationTestSuite
Static variable for test initialization.
static const uint32_t packetSize
Packet size generated at the AP.