A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
sixlowpan-iphc-test.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2013 Universita' di Firenze, Italy
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
7 */
8
9#include "ns3/boolean.h"
10#include "ns3/inet6-socket-address.h"
11#include "ns3/internet-stack-helper.h"
12#include "ns3/log.h"
13#include "ns3/node.h"
14#include "ns3/simple-channel.h"
15#include "ns3/simple-net-device.h"
16#include "ns3/simulator.h"
17#include "ns3/sixlowpan-net-device.h"
18#include "ns3/socket-factory.h"
19#include "ns3/socket.h"
20#include "ns3/test.h"
21#include "ns3/udp-socket-factory.h"
22
23#include <limits>
24#include <string>
25
26using namespace ns3;
27
28/**
29 * \ingroup sixlowpan-tests
30 *
31 * \brief 6LoWPAN IPHC Test
32 */
34{
35 Ptr<Packet> m_receivedPacket; //!< received packet
36
37 /**
38 * Send data function.
39 *
40 * \param socket The sending socket.
41 * \param to The destination.
42 */
43 void DoSendData(Ptr<Socket> socket, std::string to);
44
45 /**
46 * Send data function.
47 *
48 * \param socket The sending socket.
49 * \param to The destination.
50 */
51 void SendData(Ptr<Socket> socket, std::string to);
52
53 public:
54 void DoRun() override;
56
57 /**
58 * Packet receive function.
59 *
60 * \param socket The receiving socket.
61 * \param packet The received packet.
62 * \param from The sender.
63 */
64 void ReceivePacket(Ptr<Socket> socket, Ptr<Packet> packet, const Address& from);
65 /**
66 * Packet receive function.
67 *
68 * \param socket The receiving socket.
69 */
70 void ReceivePkt(Ptr<Socket> socket);
71};
72
74 : TestCase("Sixlowpan implementation")
75{
76}
77
78void
83
84void
86{
87 uint32_t availableData [[maybe_unused]] = socket->GetRxAvailable();
88 m_receivedPacket = socket->Recv(std::numeric_limits<uint32_t>::max(), 0);
89 NS_ASSERT(availableData == m_receivedPacket->GetSize());
90}
91
92void
94{
95 Address realTo = Inet6SocketAddress(Ipv6Address(to.c_str()), 1234);
96 uint8_t buffer[] = "\"Can you tell me where my country lies?\" \\ said the unifaun to his true "
97 "love's eyes. \\ \"It lies with me!\" cried the Queen of Maybe \\ - for her "
98 "merchandise, he traded in his prize.";
99
100 Ptr<Packet> packet = Create<Packet>(buffer, 180);
101 NS_TEST_EXPECT_MSG_EQ(socket->SendTo(packet, 0, realTo), 180, "200");
102}
103
104void
106{
108 Simulator::ScheduleWithContext(socket->GetNode()->GetId(),
109 Seconds(0),
111 this,
112 socket,
113 to);
115}
116
117void
119{
120 // Create topology
121 InternetStackHelper internet;
122 internet.SetIpv4StackInstall(false);
123
124 // Receiver Node
125 Ptr<Node> rxNode = CreateObject<Node>();
126 internet.Install(rxNode);
128 { // first interface
131 rxNode->AddDevice(rxDev);
132
134 rxNode->AddDevice(rxSix);
135 rxSix->SetNetDevice(rxDev);
136
137 Ptr<Ipv6> ipv6 = rxNode->GetObject<Ipv6>();
138 ipv6->AddInterface(rxDev);
139 uint32_t netdev_idx = ipv6->AddInterface(rxSix);
140 Ipv6InterfaceAddress ipv6Addr =
141 Ipv6InterfaceAddress(Ipv6Address("2001:0100::1"), Ipv6Prefix(64));
142 ipv6->AddAddress(netdev_idx, ipv6Addr);
143 ipv6->SetUp(netdev_idx);
144 }
145
146 // Sender Node
147 Ptr<Node> txNode = CreateObject<Node>();
148 internet.Install(txNode);
150 {
153 txNode->AddDevice(txDev);
154
156 txNode->AddDevice(txSix);
157 txSix->SetNetDevice(txDev);
158
159 Ptr<Ipv6> ipv6 = txNode->GetObject<Ipv6>();
160 ipv6->AddInterface(txDev);
161 uint32_t netdev_idx = ipv6->AddInterface(txSix);
162 Ipv6InterfaceAddress ipv6Addr =
163 Ipv6InterfaceAddress(Ipv6Address("2001:0100::2"), Ipv6Prefix(64));
164 ipv6->AddAddress(netdev_idx, ipv6Addr);
165 ipv6->SetUp(netdev_idx);
166 }
167
168 // link the two nodes
170 rxDev->SetChannel(channel1);
171 txDev->SetChannel(channel1);
172
173 // Create the UDP sockets
174 Ptr<SocketFactory> rxSocketFactory = rxNode->GetObject<UdpSocketFactory>();
175 Ptr<Socket> rxSocket = rxSocketFactory->CreateSocket();
176 NS_TEST_EXPECT_MSG_EQ(rxSocket->Bind(Inet6SocketAddress(Ipv6Address("2001:0100::1"), 1234)),
177 0,
178 "trivial");
179 rxSocket->SetRecvCallback(MakeCallback(&SixlowpanIphcImplTest::ReceivePkt, this));
180
181 Ptr<SocketFactory> txSocketFactory = txNode->GetObject<UdpSocketFactory>();
182 Ptr<Socket> txSocket = txSocketFactory->CreateSocket();
183 txSocket->SetAllowBroadcast(true);
184 // ------ Now the tests ------------
185
186 // Unicast test
187 SendData(txSocket, "2001:0100::1");
189 uint8_t rxBuffer[180];
190 uint8_t txBuffer[180] = "\"Can you tell me where my country lies?\" \\ said the unifaun to his "
191 "true love's eyes. \\ \"It lies with me!\" cried the Queen of Maybe \\ "
192 "- for her merchandise, he traded in his prize.";
193 m_receivedPacket->CopyData(rxBuffer, 180);
194 NS_TEST_EXPECT_MSG_EQ(memcmp(rxBuffer, txBuffer, 180), 0, "trivial");
195
197
199}
200
201/**
202 * \ingroup sixlowpan-tests
203 *
204 * \brief 6LoWPAN IPHC TestSuite
205 */
207{
208 public:
210
211 private:
212};
213
215 : TestSuite("sixlowpan-iphc", Type::UNIT)
216{
217 AddTestCase(new SixlowpanIphcImplTest(), TestCase::Duration::QUICK);
218}
219
220static SixlowpanIphcTestSuite g_sixlowpanIphcTestSuite; //!< Static variable for test initialization
Ptr< Packet > m_receivedPacket
received packet
void DoRun() override
Implementation to actually run this TestCase.
void SendData(Ptr< Socket > socket, std::string to)
Send data function.
void DoSendData(Ptr< Socket > socket, std::string to)
Send data function.
void ReceivePacket(Ptr< Socket > socket, Ptr< Packet > packet, const Address &from)
Packet receive function.
void ReceivePkt(Ptr< Socket > socket)
Packet receive function.
6LoWPAN IPHC TestSuite
a polymophic address class
Definition address.h:90
An Inet6 address class.
aggregate IP/TCP/UDP functionality to existing Nodes.
Describes an IPv6 address.
Access to the IPv6 forwarding table, interfaces, and configuration.
Definition ipv6.h:71
IPv6 address associated with an interface.
Describes an IPv6 prefix.
static Mac48Address ConvertFrom(const Address &address)
static Mac48Address Allocate()
Allocate a new Mac48Address.
uint32_t GetSize() const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition packet.h:850
uint32_t CopyData(uint8_t *buffer, uint32_t size) const
Copy the packet contents to a byte buffer.
Definition packet.cc:389
void RemoveAllByteTags()
Remove all byte tags stored in this packet.
Definition packet.cc:382
Smart pointer class similar to boost::intrusive_ptr.
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition simulator.cc:131
static void ScheduleWithContext(uint32_t context, const Time &delay, FUNC f, Ts &&... args)
Schedule an event with the given context.
Definition simulator.h:577
static void Run()
Run the simulation.
Definition simulator.cc:167
encapsulates test code
Definition test.h:1050
void AddTestCase(TestCase *testCase, Duration duration=Duration::QUICK)
Add an individual child TestCase to this test suite.
Definition test.cc:292
A suite of tests to run.
Definition test.h:1267
Type
Type of test.
Definition test.h:1274
API to create UDP socket instances.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition assert.h:55
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
Definition object.h:619
Ptr< T > Create(Ts &&... args)
Create class instances by constructors with varying numbers of arguments and return them by Ptr.
Definition ptr.h:436
#define NS_TEST_EXPECT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report if not.
Definition test.h:241
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition nstime.h:1308
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...
Definition callback.h:684
static SixlowpanIphcTestSuite g_sixlowpanIphcTestSuite
Static variable for test initialization.