This documentation is not the Latest Release.
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/node.h"
19 #include "ns3/packet.h"
20 #include "ns3/simulator.h"
21 #include "ns3/node-container.h"
22 #include "ns3/net-device-container.h"
23 #include "ns3/yans-wifi-helper.h"
24 #include "ns3/mobility-helper.h"
25 #include "ns3/seq-ts-header.h"
26 #include "ns3/wave-net-device.h"
27 #include "ns3/wave-mac-helper.h"
28 #include "ns3/wave-helper.h"
29 
30 using namespace ns3;
40 {
41 public:
42  void SendWsmpExample (void);
43 
44  void SendIpExample (void);
45 
46  void SendWsaExample (void);
47 
48 private:
49  void SendOneWsmpPacket (uint32_t channel, uint32_t seq);
50  void SendIpPacket (uint32_t seq, bool ipv6);
51  bool Receive (Ptr<NetDevice> dev, Ptr<const Packet> pkt, uint16_t mode, const Address &sender);
52  bool ReceiveVsa (Ptr<const Packet>,const Address &, uint32_t, uint32_t);
53  void CreateWaveNodes (void);
54 
57 };
58 void
60 {
61  nodes = NodeContainer ();
62  nodes.Create (2);
63 
65  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
66  positionAlloc->Add (Vector (0.0, 0.0, 0.0));
67  positionAlloc->Add (Vector (5.0, 0.0, 0.0));
68  mobility.SetPositionAllocator (positionAlloc);
69  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
70  mobility.Install (nodes);
71 
74  wavePhy.SetChannel (waveChannel.Create ());
77  WaveHelper waveHelper = WaveHelper::Default ();
78  devices = waveHelper.Install (wavePhy, waveMac, nodes);
79 
80  for (uint32_t i = 0; i != devices.GetN (); ++i)
81  {
82  Ptr<WaveNetDevice> device = DynamicCast<WaveNetDevice> (devices.Get (i));
85  }
86 
87  // Tracing
88  wavePhy.EnablePcap ("wave-simple-device", devices);
89 }
90 
91 bool
93 {
94  SeqTsHeader seqTs;
95  pkt->PeekHeader (seqTs);
96  std::cout << "receive a packet: " << std::endl
97  << " sequence = " << seqTs.GetSeq () << "," << std::endl
98  << " sendTime = " << seqTs.GetTs ().GetSeconds () << "s," << std::endl
99  << " recvTime = " << Now ().GetSeconds () << "s," << std::endl
100  << " protocol = 0x" << std::hex << mode << std::dec << std::endl;
101  return true;
102 }
103 
104 void
106 {
107  Ptr<WaveNetDevice> sender = DynamicCast<WaveNetDevice> (devices.Get (0));
108  Ptr<WaveNetDevice> receiver = DynamicCast<WaveNetDevice> (devices.Get (1));
109  const static uint16_t WSMP_PROT_NUMBER = 0x88DC;
110  Mac48Address bssWildcard = Mac48Address::GetBroadcast ();
111 
112  const TxInfo txInfo = TxInfo (channel);
113  Ptr<Packet> p = Create<Packet> (100);
114  SeqTsHeader seqTs;
115  seqTs.SetSeq (seq);
116  p->AddHeader (seqTs);
117  sender->SendX (p, bssWildcard, WSMP_PROT_NUMBER, txInfo);
118 }
119 
120 void
122 {
123  CreateWaveNodes ();
124  Ptr<WaveNetDevice> sender = DynamicCast<WaveNetDevice> (devices.Get (0));
125  Ptr<WaveNetDevice> receiver = DynamicCast<WaveNetDevice> (devices.Get (1));
126 
127  // Alternating access without immediate channel switch
128  const SchInfo schInfo = SchInfo (SCH1, false, EXTENDED_ALTERNATING);
129  Simulator::Schedule (Seconds (0.0), &WaveNetDevice::StartSch,sender,schInfo);
130  // An important point is that the receiver should also be assigned channel
131  // access for the same channel to receive packets.
132  Simulator::Schedule (Seconds (0.0), &WaveNetDevice::StartSch, receiver, schInfo);
133 
134  // send WSMP packets
135  // the first packet will be queued currently and be transmitted in next SCH interval
137  // the second packet will be queued currently and then be transmitted , because of in the CCH interval.
139  // the third packet will be dropped because of no channel access for SCH2.
141 
142  // release SCH access
145  // the fourth packet will be queued and be transmitted because of default CCH access assigned automatically.
147  // the fifth packet will be dropped because of no SCH1 access assigned
149 
150  Simulator::Stop (Seconds (5.0));
151  Simulator::Run ();
153 }
154 
155 void
156 WaveNetDeviceExample::SendIpPacket (uint32_t seq, bool ipv6)
157 {
158  Ptr<WaveNetDevice> sender = DynamicCast<WaveNetDevice> (devices.Get (0));
159  Ptr<WaveNetDevice> receiver = DynamicCast<WaveNetDevice> (devices.Get (1));
160  const Address dest = receiver->GetAddress ();
161  // send IPv4 packet or IPv6 packet
162  const static uint16_t IPv4_PROT_NUMBER = 0x0800;
163  const static uint16_t IPv6_PROT_NUMBER = 0x86DD;
164  uint16_t protocol = ipv6 ? IPv6_PROT_NUMBER : IPv4_PROT_NUMBER;
165  Ptr<Packet> p = Create<Packet> (100);
166  SeqTsHeader seqTs;
167  seqTs.SetSeq (seq);
168  p->AddHeader (seqTs);
169  sender->Send (p, dest, protocol);
170 }
171 
172 void
174 {
175  CreateWaveNodes ();
176  Ptr<WaveNetDevice> sender = DynamicCast<WaveNetDevice> (devices.Get (0));
177  Ptr<WaveNetDevice> receiver = DynamicCast<WaveNetDevice> (devices.Get (1));
178 
179  // Alternating access without immediate channel switch
180  const SchInfo schInfo = SchInfo (SCH1, false, EXTENDED_ALTERNATING);
181  Simulator::Schedule (Seconds (0.0), &WaveNetDevice::StartSch, sender, schInfo);
182  // An important point is that the receiver should also be assigned channel
183  // access for the same channel to receive packets.
184  Simulator::Schedule (Seconds (0.0), &WaveNetDevice::StartSch, receiver, schInfo);
185 
186  // both IPv4 and IPv6 packets below will not be inserted to internal queue because of no tx profile registered
189  //register txprofile
190  // IP packets will automatically be sent with txprofile parameter
191  const TxProfile txProfile = TxProfile (SCH1);
192  Simulator::Schedule (Seconds (2.0), &WaveNetDevice::RegisterTxProfile, sender, txProfile);
193  // both IPv4 and IPv6 packet are transmitted successfully
196  // unregister TxProfile or release channel access
200  // these packets will be dropped again because of no channel access assigned and no tx profile registered
203 
204  Simulator::Stop (Seconds (6.0));
205  Simulator::Run ();
207 }
208 
209 bool
211 {
212  std::cout << "receive a VSA management frame: recvTime = " << Now ().GetSeconds () << "s." << std::endl;
213  return true;
214 }
215 
216 void
218 {
219  CreateWaveNodes ();
220  Ptr<WaveNetDevice> sender = DynamicCast<WaveNetDevice> (devices.Get (0));
221  Ptr<WaveNetDevice> receiver = DynamicCast<WaveNetDevice> (devices.Get (1));
222 
223 // Alternating access without immediate channel switch for sender and receiver
224  const SchInfo schInfo = SchInfo (SCH1, false, EXTENDED_ALTERNATING);
225  Simulator::Schedule (Seconds (0.0), &WaveNetDevice::StartSch, sender, schInfo);
226  Simulator::Schedule (Seconds (0.0), &WaveNetDevice::StartSch, receiver, schInfo);
227 
228 // the peer address of VSA is broadcast address, and the repeat rate
229 // of VsaInfo is 100 per 5s, the VSA frame will be sent repeatedly.
230  Ptr<Packet> wsaPacket = Create<Packet> (100);
232  const VsaInfo vsaInfo = VsaInfo (dest, OrganizationIdentifier (), 0, wsaPacket, SCH1, 100, VSA_TRANSMIT_IN_BOTHI);
233  Simulator::Schedule (Seconds (1.0), &WaveNetDevice::StartVsa, sender, vsaInfo);
235 
236 // release alternating access
239 
240 // these WSA packets cannot be transmitted because of no channel access assigned
241  Simulator::Schedule (Seconds (5.0), &WaveNetDevice::StartVsa, sender, vsaInfo);
243 
244  Simulator::Stop (Seconds (6.0));
245  Simulator::Run ();
247 }
248 
249 int
250 main (int argc, char *argv[])
251 {
252  WaveNetDeviceExample example;
253  std::cout << "run WAVE WSMP routing service case:" << std::endl;
254  example.SendWsmpExample ();
255  std::cout << "run WAVE IP routing service case:" << std::endl;
256  //example.SendIpExample ();
257  std::cout << "run WAVE WSA routing service case:" << std::endl;
258  //example.SendWsaExample ();
259  return 0;
260 }
tuple channel
Definition: third.py:85
bool StopVsa(uint32_t channelNumber)
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:73
uint32_t GetSeq(void) const
tuple devices
Definition: first.py:32
bool StartSch(const SchInfo &schInfo)
void SetWaveVsaCallback(WaveVsaCallback vsaCallback)
Ptr< YansWifiChannel > Create(void) const
static YansWifiChannelHelper Default(void)
Create a channel helper in a default working state.
bool ReceiveVsa(Ptr< const Packet >, const Address &, uint32_t, uint32_t)
This simulation is to show the routing service of WaveNetDevice described in IEEE 09...
void SendOneWsmpPacket(uint32_t channel, uint32_t seq)
static void Run(void)
Run the simulation.
Definition: simulator.cc:200
bool SendX(Ptr< Packet > packet, const Address &dest, uint32_t protocol, const TxInfo &txInfo)
void SetPcapDataLinkType(enum SupportedPcapDataLinkTypes dlt)
Set the data link type of PCAP traces to be used.
static WaveHelper Default(void)
Definition: wave-helper.cc:626
virtual NetDeviceContainer Install(const WifiPhyHelper &phy, const WifiMacHelper &mac, NodeContainer c) const
Definition: wave-helper.cc:718
#define CCH
virtual void SetReceiveCallback(NetDevice::ReceiveCallback cb)
a polymophic address class
Definition: address.h:90
IEEE 802.11 Wireless LAN headers on packets.
tuple nodes
Definition: first.py:25
void SetChannel(Ptr< YansWifiChannel > channel)
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:341
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
tuple mobility
Definition: third.py:101
static EventId Schedule(Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event to expire after delay.
Definition: simulator.h:1216
#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:110
holds a vector of ns3::NetDevice pointers
void SendIpPacket(uint32_t seq, bool ipv6)
static Mac48Address GetBroadcast(void)
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Definition: callback.h:1480
#define SCH2
static void Destroy(void)
Execute the events scheduled with ScheduleDestroy().
Definition: simulator.cc:164
bool StopSch(uint32_t channelNumber)
Introspection did not find any typical Config paths.
Definition: seq-ts-header.h:36
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
Definition: packet.cc:276
Every class exported by the ns3 library is enclosed in the ns3 namespace.
keep track of a set of node pointers.
void SetMobilityModel(std::string type, std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue(), std::string n8="", const AttributeValue &v8=EmptyAttributeValue(), std::string n9="", const AttributeValue &v9=EmptyAttributeValue())
an EUI-48 address
Definition: mac48-address.h:43
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:39
NetDeviceContainer devices
Helper class used to assign positions and mobility models to nodes.
bool StartVsa(const VsaInfo &vsaInfo)
Time GetTs(void) const
static YansWavePhyHelper Default(void)
Create a phy helper in a default working state.
Definition: wave-helper.cc:480
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:208
void SetSeq(uint32_t seq)
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:895
void Add(Vector v)
Add a position to the list of positions.
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:330
tuple address
Definition: first.py:37
void EnablePcap(std::string prefix, Ptr< NetDevice > nd, bool promiscuous=false, bool explicitFilename=false)
Enable pcap output the indicated net device.
void SetPositionAllocator(Ptr< PositionAllocator > allocator)
Set the position allocator which will be used to allocate the initial position of every node initiali...
bool Receive(Ptr< NetDevice > dev, Ptr< const Packet > pkt, uint16_t mode, const Address &sender)
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:255