OLD | NEW |
(Empty) | |
| 1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ |
| 2 /* |
| 3 * Copyright (c) 2016 NITK Surathkal |
| 4 * |
| 5 * This program is free software; you can redistribute it and/or modify |
| 6 * it under the terms of the GNU General Public License version 2 as |
| 7 * published by the Free Software Foundation; |
| 8 * |
| 9 * This program is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 12 * GNU General Public License for more details. |
| 13 * |
| 14 * You should have received a copy of the GNU General Public License |
| 15 * along with this program; if not, write to the Free Software |
| 16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 17 * |
| 18 * Authors: Ankit Deepak <adadeepak8@gmail.com> |
| 19 * Shravya Ks <shravya.ks0@gmail.com>, |
| 20 * Mohit P. Tahiliani <tahiliani@nitk.edu.in> |
| 21 */ |
| 22 |
| 23 /* |
| 24 * PORT NOTE: This code was ported from ns-3 IPv4 implementation (src/olsr). A
lmost all |
| 25 * comments have also been ported from the same |
| 26 */ |
| 27 |
| 28 |
| 29 #include <vector> |
| 30 #include "hello-regression-test.h" |
| 31 #include "ns3/simulator.h" |
| 32 #include "ns3/random-variable-stream.h" |
| 33 #include "ns3/rng-seed-manager.h" |
| 34 #include "ns3/double.h" |
| 35 #include "ns3/uinteger.h" |
| 36 #include "ns3/string.h" |
| 37 #include "ns3/olsr6-helper.h" |
| 38 #include "ns3/internet-stack-helper.h" |
| 39 #include "ns3/simple-net-device-helper.h" |
| 40 #include "ns3/ipv6-address-helper.h" |
| 41 #include "ns3/abort.h" |
| 42 #include "ns3/socket-factory.h" |
| 43 #include "ns3/ipv6-raw-socket-factory.h" |
| 44 #include "ns3/udp-l4-protocol.h" |
| 45 #include "ns3/udp-header.h" |
| 46 #include "ns3/olsr6-header.h" |
| 47 |
| 48 namespace ns3 { |
| 49 namespace olsr6 { |
| 50 |
| 51 HelloRegressionTest::HelloRegressionTest () |
| 52 : TestCase ("Test OLSR6 Hello messages generation"), |
| 53 m_time (Seconds (5)), |
| 54 m_countA (0), |
| 55 m_countB (0) |
| 56 { |
| 57 } |
| 58 |
| 59 HelloRegressionTest::~HelloRegressionTest () |
| 60 { |
| 61 } |
| 62 |
| 63 void |
| 64 HelloRegressionTest::DoRun () |
| 65 { |
| 66 RngSeedManager::SetSeed (12345); |
| 67 RngSeedManager::SetRun (7); |
| 68 CreateNodes (); |
| 69 |
| 70 Simulator::Stop (m_time); |
| 71 Simulator::Run (); |
| 72 |
| 73 m_rxSocketA = 0; |
| 74 m_rxSocketB = 0; |
| 75 Simulator::Destroy (); |
| 76 } |
| 77 |
| 78 void |
| 79 HelloRegressionTest::CreateNodes () |
| 80 { |
| 81 // create 2 nodes |
| 82 NodeContainer c; |
| 83 c.Create (2); |
| 84 // install TCP/IP & OLSR6 |
| 85 Olsr6Helper olsr6; |
| 86 InternetStackHelper internet; |
| 87 internet.SetRoutingHelper (olsr6); |
| 88 internet.Install (c); |
| 89 // Assign OLSR6 RVs to specific streams |
| 90 int64_t streamsUsed = olsr6.AssignStreams (c, 0); |
| 91 NS_TEST_ASSERT_MSG_EQ (streamsUsed, 2, "Should have assigned 2 streams"); |
| 92 // create channel & devices |
| 93 SimpleNetDeviceHelper simpleNetHelper; |
| 94 simpleNetHelper.SetDeviceAttribute ("DataRate", StringValue ("5Mbps")); |
| 95 simpleNetHelper.SetChannelAttribute ("Delay", StringValue ("2ms")); |
| 96 NetDeviceContainer nd = simpleNetHelper.Install (c); |
| 97 // setup IP addresses |
| 98 Ipv6AddressHelper ipv6; |
| 99 ipv6.SetBase ("2001:1::", Ipv6Prefix (64)); |
| 100 ipv6.Assign (nd); |
| 101 |
| 102 // Create the sockets |
| 103 Ptr<SocketFactory> rxSocketFactoryA = c.Get (0)->GetObject<Ipv6RawSocketFactor
y> (); |
| 104 m_rxSocketA = DynamicCast<Ipv6RawSocketImpl> (rxSocketFactoryA->CreateSocket (
)); |
| 105 m_rxSocketA->SetProtocol (UdpL4Protocol::PROT_NUMBER); |
| 106 m_rxSocketA->SetRecvCallback (MakeCallback (&HelloRegressionTest::ReceivePktPr
obeA, this)); |
| 107 |
| 108 Ptr<SocketFactory> rxSocketFactoryB = c.Get (1)->GetObject<Ipv6RawSocketFactor
y> (); |
| 109 m_rxSocketB = DynamicCast<Ipv6RawSocketImpl> (rxSocketFactoryB->CreateSocket (
)); |
| 110 m_rxSocketB->SetProtocol (UdpL4Protocol::PROT_NUMBER); |
| 111 m_rxSocketB->SetRecvCallback (MakeCallback (&HelloRegressionTest::ReceivePktPr
obeB, this)); |
| 112 } |
| 113 |
| 114 void |
| 115 HelloRegressionTest::ReceivePktProbeA (Ptr<Socket> socket) |
| 116 { |
| 117 uint32_t availableData; |
| 118 availableData = socket->GetRxAvailable (); |
| 119 Ptr<Packet> receivedPacketProbe = socket->Recv (std::numeric_limits<uint32_t>:
:max (), 0); |
| 120 NS_ASSERT (availableData == receivedPacketProbe->GetSize ()); |
| 121 |
| 122 Ipv6Header ipHdr; |
| 123 receivedPacketProbe->RemoveHeader (ipHdr); |
| 124 UdpHeader udpHdr; |
| 125 receivedPacketProbe->RemoveHeader (udpHdr); |
| 126 PacketHeader pktHdr; |
| 127 receivedPacketProbe->RemoveHeader (pktHdr); |
| 128 MessageHeader msgHdr; |
| 129 receivedPacketProbe->RemoveHeader (msgHdr); |
| 130 |
| 131 const olsr6::MessageHeader::Hello &hello = msgHdr.GetHello (); |
| 132 NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv6Address ("::"), "Or
iginator address."); |
| 133 |
| 134 if (m_countA == 0) |
| 135 { |
| 136 NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 0, "No Link messages on
the first Hello."); |
| 137 } |
| 138 else |
| 139 { |
| 140 NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 1, "One Link message on
the second and third Hello."); |
| 141 } |
| 142 |
| 143 std::vector<olsr6::MessageHeader::Hello::LinkMessage>::const_iterator iter; |
| 144 for (iter = hello.linkMessages.begin (); iter != hello.linkMessages.end (); it
er++) |
| 145 { |
| 146 if (m_countA == 1) |
| 147 { |
| 148 NS_TEST_EXPECT_MSG_EQ (iter->linkCode, 1, "Asymmetric link on second H
ello."); |
| 149 } |
| 150 else |
| 151 { |
| 152 NS_TEST_EXPECT_MSG_EQ (iter->linkCode, 6, "Symmetric link on second He
llo."); |
| 153 } |
| 154 |
| 155 NS_TEST_EXPECT_MSG_EQ (iter->neighborInterfaceAddresses.size (), 1, "Only
one neighbor."); |
| 156 NS_TEST_EXPECT_MSG_EQ (iter->neighborInterfaceAddresses[0], Ipv6Address ("
::"), "Only one neighbor."); |
| 157 } |
| 158 |
| 159 m_countA++; |
| 160 } |
| 161 |
| 162 void |
| 163 HelloRegressionTest::ReceivePktProbeB (Ptr<Socket> socket) |
| 164 { |
| 165 uint32_t availableData; |
| 166 availableData = socket->GetRxAvailable (); |
| 167 Ptr<Packet> receivedPacketProbe = socket->Recv (std::numeric_limits<uint32_t>:
:max (), 0); |
| 168 NS_ASSERT (availableData == receivedPacketProbe->GetSize ()); |
| 169 |
| 170 Ipv6Header ipHdr; |
| 171 receivedPacketProbe->RemoveHeader (ipHdr); |
| 172 UdpHeader udpHdr; |
| 173 receivedPacketProbe->RemoveHeader (udpHdr); |
| 174 PacketHeader pktHdr; |
| 175 receivedPacketProbe->RemoveHeader (pktHdr); |
| 176 MessageHeader msgHdr; |
| 177 receivedPacketProbe->RemoveHeader (msgHdr); |
| 178 |
| 179 const olsr6::MessageHeader::Hello &hello = msgHdr.GetHello (); |
| 180 NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv6Address ("::"), "Or
iginator address."); |
| 181 |
| 182 if (m_countA == 0) |
| 183 { |
| 184 NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 0, "No Link messages on
the first Hello."); |
| 185 } |
| 186 else |
| 187 { |
| 188 NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 1, "One Link message on
the second and third Hello."); |
| 189 } |
| 190 |
| 191 std::vector<olsr6::MessageHeader::Hello::LinkMessage>::const_iterator iter; |
| 192 for (iter = hello.linkMessages.begin (); iter != hello.linkMessages.end (); it
er++) |
| 193 { |
| 194 if (m_countA == 1) |
| 195 { |
| 196 NS_TEST_EXPECT_MSG_EQ (iter->linkCode, 1, "Asymmetric link on second H
ello."); |
| 197 } |
| 198 else |
| 199 { |
| 200 NS_TEST_EXPECT_MSG_EQ (iter->linkCode, 6, "Symmetric link on second He
llo."); |
| 201 } |
| 202 |
| 203 NS_TEST_EXPECT_MSG_EQ (iter->neighborInterfaceAddresses.size (), 1, "Only
one neighbor."); |
| 204 NS_TEST_EXPECT_MSG_EQ (iter->neighborInterfaceAddresses[0], Ipv6Address ("
::"), "Only one neighbor."); |
| 205 } |
| 206 |
| 207 m_countB++; |
| 208 } |
| 209 |
| 210 } |
| 211 } |
OLD | NEW |