A Discrete-Event Network Simulator
API
wave-simple-device.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 as
5 * published by the Free Software Foundation;
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15 *
16 * Author: Junling Bu <linlinjavaer@gmail.com>
17 */
18#include "ns3/command-line.h"
19#include "ns3/node.h"
20#include "ns3/packet.h"
21#include "ns3/simulator.h"
22#include "ns3/node-container.h"
23#include "ns3/net-device-container.h"
24#include "ns3/yans-wifi-helper.h"
25#include "ns3/mobility-helper.h"
26#include "ns3/seq-ts-header.h"
27#include "ns3/wave-net-device.h"
28#include "ns3/wave-mac-helper.h"
29#include "ns3/wave-helper.h"
30
31using namespace ns3;
41{
42public:
44 void SendWsmpExample (void);
45
47 void SendIpExample (void);
48
50 void SendWsaExample (void);
51
52private:
64 void SendIpPacket (uint32_t seq, bool ipv6);
73 bool Receive (Ptr<NetDevice> dev, Ptr<const Packet> pkt, uint16_t mode, const Address &sender);
82 void CreateWaveNodes (void);
83
86};
87void
89{
91 nodes.Create (2);
92
94 Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
95 positionAlloc->Add (Vector (0.0, 0.0, 0.0));
96 positionAlloc->Add (Vector (5.0, 0.0, 0.0));
97 mobility.SetPositionAllocator (positionAlloc);
98 mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
99 mobility.Install (nodes);
100
101 YansWifiChannelHelper waveChannel = YansWifiChannelHelper::Default ();
102 YansWavePhyHelper wavePhy = YansWavePhyHelper::Default ();
103 wavePhy.SetChannel (waveChannel.Create ());
104 wavePhy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11);
105 QosWaveMacHelper waveMac = QosWaveMacHelper::Default ();
106 WaveHelper waveHelper = WaveHelper::Default ();
107 devices = waveHelper.Install (wavePhy, waveMac, nodes);
108
109 for (uint32_t i = 0; i != devices.GetN (); ++i)
110 {
111 Ptr<WaveNetDevice> device = DynamicCast<WaveNetDevice> (devices.Get (i));
114 }
115
116 // Tracing
117 wavePhy.EnablePcap ("wave-simple-device", devices);
118}
119
120bool
122{
123 SeqTsHeader seqTs;
124 pkt->PeekHeader (seqTs);
125 std::cout << "receive a packet: " << std::endl
126 << " sequence = " << seqTs.GetSeq () << "," << std::endl
127 << " sendTime = " << seqTs.GetTs ().As (Time::S) << "," << std::endl
128 << " recvTime = " << Now ().As (Time::S) << "," << std::endl
129 << " protocol = 0x" << std::hex << mode << std::dec << std::endl;
130 return true;
131}
132
133void
135{
136 Ptr<WaveNetDevice> sender = DynamicCast<WaveNetDevice> (devices.Get (0));
137 Ptr<WaveNetDevice> receiver = DynamicCast<WaveNetDevice> (devices.Get (1));
138 const static uint16_t WSMP_PROT_NUMBER = 0x88DC;
139 Mac48Address bssWildcard = Mac48Address::GetBroadcast ();
140
141 const TxInfo txInfo = TxInfo (channel);
142 Ptr<Packet> p = Create<Packet> (100);
143 SeqTsHeader seqTs;
144 seqTs.SetSeq (seq);
145 p->AddHeader (seqTs);
146 sender->SendX (p, bssWildcard, WSMP_PROT_NUMBER, txInfo);
147}
148
149void
151{
153 Ptr<WaveNetDevice> sender = DynamicCast<WaveNetDevice> (devices.Get (0));
154 Ptr<WaveNetDevice> receiver = DynamicCast<WaveNetDevice> (devices.Get (1));
155
156 // Alternating access without immediate channel switch
157 const SchInfo schInfo = SchInfo (SCH1, false, EXTENDED_ALTERNATING);
158 Simulator::Schedule (Seconds (0.0), &WaveNetDevice::StartSch,sender,schInfo);
159 // An important point is that the receiver should also be assigned channel
160 // access for the same channel to receive packets.
161 Simulator::Schedule (Seconds (0.0), &WaveNetDevice::StartSch, receiver, schInfo);
162
163 // send WSMP packets
164 // the first packet will be queued currently and be transmitted in next SCH interval
165 Simulator::Schedule (Seconds (1.0), &WaveNetDeviceExample::SendOneWsmpPacket, this, SCH1, 1);
166 // the second packet will be queued currently and then be transmitted , because of in the CCH interval.
167 Simulator::Schedule (Seconds (1.0), &WaveNetDeviceExample::SendOneWsmpPacket, this, CCH, 2);
168 // the third packet will be dropped because of no channel access for SCH2.
169 Simulator::Schedule (Seconds (1.0), &WaveNetDeviceExample::SendOneWsmpPacket, this, SCH2, 3);
170
171 // release SCH access
172 Simulator::Schedule (Seconds (2.0), &WaveNetDevice::StopSch, sender, SCH1);
173 Simulator::Schedule (Seconds (2.0), &WaveNetDevice::StopSch, receiver, SCH1);
174 // the fourth packet will be queued and be transmitted because of default CCH access assigned automatically.
175 Simulator::Schedule (Seconds (3.0), &WaveNetDeviceExample::SendOneWsmpPacket, this, CCH, 4);
176 // the fifth packet will be dropped because of no SCH1 access assigned
177 Simulator::Schedule (Seconds (3.0), &WaveNetDeviceExample::SendOneWsmpPacket, this, SCH1, 5);
178
179 Simulator::Stop (Seconds (5.0));
180 Simulator::Run ();
181 Simulator::Destroy ();
182}
183
184void
186{
187 Ptr<WaveNetDevice> sender = DynamicCast<WaveNetDevice> (devices.Get (0));
188 Ptr<WaveNetDevice> receiver = DynamicCast<WaveNetDevice> (devices.Get (1));
189 const Address dest = receiver->GetAddress ();
190 // send IPv4 packet or IPv6 packet
191 const static uint16_t IPv4_PROT_NUMBER = 0x0800;
192 const static uint16_t IPv6_PROT_NUMBER = 0x86DD;
193 uint16_t protocol = ipv6 ? IPv6_PROT_NUMBER : IPv4_PROT_NUMBER;
194 Ptr<Packet> p = Create<Packet> (100);
195 SeqTsHeader seqTs;
196 seqTs.SetSeq (seq);
197 p->AddHeader (seqTs);
198 sender->Send (p, dest, protocol);
199}
200
201void
203{
205 Ptr<WaveNetDevice> sender = DynamicCast<WaveNetDevice> (devices.Get (0));
206 Ptr<WaveNetDevice> receiver = DynamicCast<WaveNetDevice> (devices.Get (1));
207
208 // Alternating access without immediate channel switch
209 const SchInfo schInfo = SchInfo (SCH1, false, EXTENDED_ALTERNATING);
210 Simulator::Schedule (Seconds (0.0), &WaveNetDevice::StartSch, sender, schInfo);
211 // An important point is that the receiver should also be assigned channel
212 // access for the same channel to receive packets.
213 Simulator::Schedule (Seconds (0.0), &WaveNetDevice::StartSch, receiver, schInfo);
214
215 // both IPv4 and IPv6 packets below will not be inserted to internal queue because of no tx profile registered
216 Simulator::Schedule (Seconds (1.0), &WaveNetDeviceExample::SendIpPacket, this, 1, true);
217 Simulator::Schedule (Seconds (1.050), &WaveNetDeviceExample::SendIpPacket, this, 2, false);
218 //register txprofile
219 // IP packets will automatically be sent with txprofile parameter
220 const TxProfile txProfile = TxProfile (SCH1);
221 Simulator::Schedule (Seconds (2.0), &WaveNetDevice::RegisterTxProfile, sender, txProfile);
222 // both IPv4 and IPv6 packet are transmitted successfully
223 Simulator::Schedule (Seconds (3.0), &WaveNetDeviceExample::SendIpPacket, this, 3, true);
224 Simulator::Schedule (Seconds (3.050), &WaveNetDeviceExample::SendIpPacket, this, 4, false);
225 // unregister TxProfile or release channel access
226 Simulator::Schedule (Seconds (4.0),&WaveNetDevice::DeleteTxProfile, sender,SCH1);
227 Simulator::Schedule (Seconds (4.0),&WaveNetDevice::StopSch, sender,SCH1);
228 Simulator::Schedule (Seconds (4.0),&WaveNetDevice::StopSch, receiver, SCH1);
229 // these packets will be dropped again because of no channel access assigned and no tx profile registered
230 Simulator::Schedule (Seconds (5.0), &WaveNetDeviceExample::SendIpPacket, this, 5, true);
231 Simulator::Schedule (Seconds (5.050), &WaveNetDeviceExample::SendIpPacket, this, 6, false);
232
233 Simulator::Stop (Seconds (6.0));
234 Simulator::Run ();
235 Simulator::Destroy ();
236}
237
238bool
240{
241 std::cout << "receive a VSA management frame: recvTime = " << Now ().As (Time::S) << "." << std::endl;
242 return true;
243}
244
245void
247{
249 Ptr<WaveNetDevice> sender = DynamicCast<WaveNetDevice> (devices.Get (0));
250 Ptr<WaveNetDevice> receiver = DynamicCast<WaveNetDevice> (devices.Get (1));
251
252// Alternating access without immediate channel switch for sender and receiver
253 const SchInfo schInfo = SchInfo (SCH1, false, EXTENDED_ALTERNATING);
254 Simulator::Schedule (Seconds (0.0), &WaveNetDevice::StartSch, sender, schInfo);
255 Simulator::Schedule (Seconds (0.0), &WaveNetDevice::StartSch, receiver, schInfo);
256
257// the peer address of VSA is broadcast address, and the repeat rate
258// of VsaInfo is 100 per 5s, the VSA frame will be sent repeatedly.
259 Ptr<Packet> wsaPacket = Create<Packet> (100);
260 Mac48Address dest = Mac48Address::GetBroadcast ();
261 const VsaInfo vsaInfo = VsaInfo (dest, OrganizationIdentifier (), 0, wsaPacket, SCH1, 100, VSA_TRANSMIT_IN_BOTHI);
262 Simulator::Schedule (Seconds (1.0), &WaveNetDevice::StartVsa, sender, vsaInfo);
263 Simulator::Schedule (Seconds (3.0), &WaveNetDevice::StopVsa, sender, SCH1);
264
265// release alternating access
266 Simulator::Schedule (Seconds (4.0), &WaveNetDevice::StopSch, sender, SCH1);
267 Simulator::Schedule (Seconds (4.0), &WaveNetDevice::StopSch, receiver, SCH1);
268
269// these WSA packets cannot be transmitted because of no channel access assigned
270 Simulator::Schedule (Seconds (5.0), &WaveNetDevice::StartVsa, sender, vsaInfo);
271 Simulator::Schedule (Seconds (6.0), &WaveNetDevice::StopVsa, sender, SCH1);
272
273 Simulator::Stop (Seconds (6.0));
274 Simulator::Run ();
275 Simulator::Destroy ();
276}
277
278int
279main (int argc, char *argv[])
280{
281 CommandLine cmd (__FILE__);
282 cmd.Parse (argc, argv);
283
284 WaveNetDeviceExample example;
285 std::cout << "run WAVE WSMP routing service case:" << std::endl;
286 example.SendWsmpExample ();
287 std::cout << "run WAVE IP routing service case:" << std::endl;
288 //example.SendIpExample ();
289 std::cout << "run WAVE WSA routing service case:" << std::endl;
290 //example.SendWsaExample ();
291 return 0;
292}
#define SCH2
#define SCH1
#define CCH
#define EXTENDED_ALTERNATING
This simulation is to show the routing service of WaveNetDevice described in IEEE 09....
bool Receive(Ptr< NetDevice > dev, Ptr< const Packet > pkt, uint16_t mode, const Address &sender)
Receive function.
void SendOneWsmpPacket(uint32_t channel, uint32_t seq)
Send one WSMP packet function.
NetDeviceContainer devices
the devices
void SendIpPacket(uint32_t seq, bool ipv6)
Send IP packet function.
void CreateWaveNodes(void)
Create WAVE nodes function.
NodeContainer nodes
the nodes
void SendIpExample(void)
Send IP example function.
void SendWsaExample(void)
Send WSA example.
void SendWsmpExample(void)
Send WSMP example function.
bool ReceiveVsa(Ptr< const Packet > pkt, const Address &address, uint32_t, uint32_t)
Receive VSA function.
a polymophic address class
Definition: address.h:91
Parse command-line arguments.
Definition: command-line.h:229
an EUI-48 address
Definition: mac48-address.h:44
Helper class used to assign positions and mobility models to nodes.
holds a vector of ns3::NetDevice pointers
uint32_t GetN(void) const
Get the number of Ptr<NetDevice> stored in this container.
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
keep track of a set of node pointers.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
the organization identifier is a public organizationally unique identifier assigned by the IEEE.
void AddHeader(const Header &header)
Add header to this packet.
Definition: packet.cc:256
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
Definition: packet.cc:290
void EnablePcap(std::string prefix, Ptr< NetDevice > nd, bool promiscuous=false, bool explicitFilename=false)
Enable pcap output the indicated net device.
Qos Wave Mac Helper class.
Packet header to carry sequence number and timestamp.
Definition: seq-ts-header.h:45
void SetSeq(uint32_t seq)
uint32_t GetSeq(void) const
Time GetTs(void) const
TimeWithUnit As(const enum Unit unit=Time::AUTO) const
Attach a unit to a Time, to facilitate output in a specific unit.
Definition: time.cc:432
helps to create WaveNetDevice objects
Definition: wave-helper.h:114
virtual NetDeviceContainer Install(const WifiPhyHelper &phy, const WifiMacHelper &mac, NodeContainer c) const
Definition: wave-helper.cc:361
virtual Address GetAddress(void) const
virtual bool Send(Ptr< Packet > packet, const Address &dest, uint16_t protocolNumber)
virtual void SetReceiveCallback(NetDevice::ReceiveCallback cb)
bool SendX(Ptr< Packet > packet, const Address &dest, uint32_t protocol, const TxInfo &txInfo)
void SetWaveVsaCallback(WaveVsaCallback vsaCallback)
void SetPcapDataLinkType(SupportedPcapDataLinkTypes dlt)
Set the data link type of PCAP traces to be used.
Definition: wifi-helper.cc:574
To trace WaveNetDevice, we have to overwrite the trace functions of class YansWifiPhyHelper.
Definition: wave-helper.h:41
manage and create wifi channel objects for the YANS model.
Ptr< YansWifiChannel > Create(void) const
void SetChannel(Ptr< YansWifiChannel > channel)
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:287
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1244
@ VSA_TRANSMIT_IN_BOTHI
Definition: vsa-manager.h:38
address
Definition: first.py:44
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition: callback.h:1648
cmd
Definition: second.py:35
channel
Definition: third.py:92
mobility
Definition: third.py:107