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 
31 using namespace ns3;
41 {
42 public:
44  void SendWsmpExample (void);
45 
47  void SendIpExample (void);
48 
50  void SendWsaExample (void);
51 
52 private:
58  void SendOneWsmpPacket (uint32_t channel, uint32_t seq);
64  void SendIpPacket (uint32_t seq, bool ipv6);
73  bool Receive (Ptr<NetDevice> dev, Ptr<const Packet> pkt, uint16_t mode, const Address &sender);
80  bool ReceiveVsa (Ptr<const Packet> pkt,const Address & address, uint32_t, uint32_t);
82  void CreateWaveNodes (void);
83 
86 };
87 void
89 {
90  nodes = NodeContainer ();
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 
103  wavePhy.SetChannel (waveChannel.Create ());
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 
120 bool
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 ().GetSeconds () << "s," << std::endl
128  << " recvTime = " << Now ().GetSeconds () << "s," << std::endl
129  << " protocol = 0x" << std::hex << mode << std::dec << std::endl;
130  return true;
131 }
132 
133 void
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 
149 void
151 {
152  CreateWaveNodes ();
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
166  // the second packet will be queued currently and then be transmitted , because of in the CCH interval.
168  // the third packet will be dropped because of no channel access for SCH2.
170 
171  // release SCH access
174  // the fourth packet will be queued and be transmitted because of default CCH access assigned automatically.
176  // the fifth packet will be dropped because of no SCH1 access assigned
178 
179  Simulator::Stop (Seconds (5.0));
180  Simulator::Run ();
182 }
183 
184 void
185 WaveNetDeviceExample::SendIpPacket (uint32_t seq, bool ipv6)
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 
201 void
203 {
204  CreateWaveNodes ();
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
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
225  // unregister TxProfile or release channel access
229  // these packets will be dropped again because of no channel access assigned and no tx profile registered
232 
233  Simulator::Stop (Seconds (6.0));
234  Simulator::Run ();
236 }
237 
238 bool
240 {
241  std::cout << "receive a VSA management frame: recvTime = " << Now ().GetSeconds () << "s." << std::endl;
242  return true;
243 }
244 
245 void
247 {
248  CreateWaveNodes ();
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);
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);
264 
265 // release alternating access
268 
269 // these WSA packets cannot be transmitted because of no channel access assigned
270  Simulator::Schedule (Seconds (5.0), &WaveNetDevice::StartVsa, sender, vsaInfo);
272 
273  Simulator::Stop (Seconds (6.0));
274  Simulator::Run ();
276 }
277 
278 int
279 main (int argc, char *argv[])
280 {
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 }
void SendIpExample(void)
Send IP example function.
bool StopVsa(uint32_t channelNumber)
void SendWsaExample(void)
Send WSA example.
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:73
bool StartSch(const SchInfo &schInfo)
void SetWaveVsaCallback(WaveVsaCallback vsaCallback)
static YansWifiChannelHelper Default(void)
Create a channel helper in a default working state.
This simulation is to show the routing service of WaveNetDevice described in IEEE 09...
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:355
void SendOneWsmpPacket(uint32_t channel, uint32_t seq)
Send one WSMP packet function.
static void Run(void)
Run the simulation.
Definition: simulator.cc:226
bool SendX(Ptr< Packet > packet, const Address &dest, uint32_t protocol, const TxInfo &txInfo)
void SendWsmpExample(void)
Send WSMP example function.
static WaveHelper Default(void)
Definition: wave-helper.cc:269
cmd
Definition: second.py:35
#define CCH
virtual void SetReceiveCallback(NetDevice::ReceiveCallback cb)
a polymophic address class
Definition: address.h:90
Ptr< YansWifiChannel > Create(void) const
channel
Definition: third.py:85
mobility
Definition: third.py:101
void SetChannel(Ptr< YansWifiChannel > channel)
nodes
Definition: first.py:25
static EventId Schedule(Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event to expire after delay.
Definition: simulator.h:1381
#define EXTENDED_ALTERNATING
the organization identifier is a public organizationally unique identifier assigned by the IEEE...
bool DeleteTxProfile(uint32_t channelNumber)
helps to create WaveNetDevice objects
Definition: wave-helper.h:112
holds a vector of ns3::NetDevice pointers
void SendIpPacket(uint32_t seq, bool ipv6)
Send IP packet function.
static Mac48Address GetBroadcast(void)
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
Definition: packet.cc:290
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Definition: callback.h:1489
#define SCH2
void CreateWaveNodes(void)
Create WAVE nodes function.
Qos Wave Mac Helper class.
Parse command-line arguments.
Definition: command-line.h:213
static void Destroy(void)
Execute the events scheduled with ScheduleDestroy().
Definition: simulator.cc:190
bool StopSch(uint32_t channelNumber)
Packet header for UDP client/server application.
Definition: seq-ts-header.h:36
uint32_t GetSeq(void) const
Every class exported by the ns3 library is enclosed in the ns3 namespace.
keep track of a set of node pointers.
address
Definition: first.py:37
an EUI-48 address
Definition: mac48-address.h:43
virtual NetDeviceContainer Install(const WifiPhyHelper &phy, const WifiMacHelper &mac, NodeContainer c) const
Definition: wave-helper.cc:361
manage and create wifi channel objects for the yans model.
To trace WaveNetDevice, we have to overwrite the trace functions of class YansWifiPhyHelper.
Definition: wave-helper.h:40
void SetPcapDataLinkType(SupportedPcapDataLinkTypes dlt)
Set the data link type of PCAP traces to be used.
Definition: wifi-helper.cc:453
NetDeviceContainer devices
the devices
Helper class used to assign positions and mobility models to nodes.
bool StartVsa(const VsaInfo &vsaInfo)
static YansWavePhyHelper Default(void)
Create a phy helper in a default working state.
Definition: wave-helper.cc:123
static QosWaveMacHelper Default(void)
Create a mac helper in a default working state.
static void Stop(void)
Tell the Simulator the calling event should be the last one executed.
Definition: simulator.cc:234
void SetSeq(uint32_t seq)
IEEE 802.11 Wireless LAN headers on packets.
Definition: wifi-helper.h:109
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1014
void Add(Vector v)
Add a position to the list of positions.
NodeContainer nodes
the nodes
bool ReceiveVsa(Ptr< const Packet > pkt, const Address &address, uint32_t, uint32_t)
Receive VSA function.
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:365
void EnablePcap(std::string prefix, Ptr< NetDevice > nd, bool promiscuous=false, bool explicitFilename=false)
Enable pcap output the indicated net device.
devices
Definition: first.py:32
bool Receive(Ptr< NetDevice > dev, Ptr< const Packet > pkt, uint16_t mode, const Address &sender)
Receive function.
Time GetTs(void) const
bool RegisterTxProfile(const TxProfile &txprofile)
#define SCH1
virtual bool Send(Ptr< Packet > packet, const Address &dest, uint16_t protocolNumber)
void AddHeader(const Header &header)
Add header to this packet.
Definition: packet.cc:256