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:
43  void SendWsmpExample (void);
44 
45  void SendIpExample (void);
46 
47  void SendWsaExample (void);
48 
49 private:
50  void SendOneWsmpPacket (uint32_t channel, uint32_t seq);
51  void SendIpPacket (uint32_t seq, bool ipv6);
52  bool Receive (Ptr<NetDevice> dev, Ptr<const Packet> pkt, uint16_t mode, const Address &sender);
53  bool ReceiveVsa (Ptr<const Packet>,const Address &, uint32_t, uint32_t);
54  void CreateWaveNodes (void);
55 
58 };
59 void
61 {
62  nodes = NodeContainer ();
63  nodes.Create (2);
64 
66  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
67  positionAlloc->Add (Vector (0.0, 0.0, 0.0));
68  positionAlloc->Add (Vector (5.0, 0.0, 0.0));
69  mobility.SetPositionAllocator (positionAlloc);
70  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
71  mobility.Install (nodes);
72 
75  wavePhy.SetChannel (waveChannel.Create ());
78  WaveHelper waveHelper = WaveHelper::Default ();
79  devices = waveHelper.Install (wavePhy, waveMac, nodes);
80 
81  for (uint32_t i = 0; i != devices.GetN (); ++i)
82  {
83  Ptr<WaveNetDevice> device = DynamicCast<WaveNetDevice> (devices.Get (i));
86  }
87 
88  // Tracing
89  wavePhy.EnablePcap ("wave-simple-device", devices);
90 }
91 
92 bool
94 {
95  SeqTsHeader seqTs;
96  pkt->PeekHeader (seqTs);
97  std::cout << "receive a packet: " << std::endl
98  << " sequence = " << seqTs.GetSeq () << "," << std::endl
99  << " sendTime = " << seqTs.GetTs ().GetSeconds () << "s," << std::endl
100  << " recvTime = " << Now ().GetSeconds () << "s," << std::endl
101  << " protocol = 0x" << std::hex << mode << std::dec << std::endl;
102  return true;
103 }
104 
105 void
107 {
108  Ptr<WaveNetDevice> sender = DynamicCast<WaveNetDevice> (devices.Get (0));
109  Ptr<WaveNetDevice> receiver = DynamicCast<WaveNetDevice> (devices.Get (1));
110  const static uint16_t WSMP_PROT_NUMBER = 0x88DC;
111  Mac48Address bssWildcard = Mac48Address::GetBroadcast ();
112 
113  const TxInfo txInfo = TxInfo (channel);
114  Ptr<Packet> p = Create<Packet> (100);
115  SeqTsHeader seqTs;
116  seqTs.SetSeq (seq);
117  p->AddHeader (seqTs);
118  sender->SendX (p, bssWildcard, WSMP_PROT_NUMBER, txInfo);
119 }
120 
121 void
123 {
124  CreateWaveNodes ();
125  Ptr<WaveNetDevice> sender = DynamicCast<WaveNetDevice> (devices.Get (0));
126  Ptr<WaveNetDevice> receiver = DynamicCast<WaveNetDevice> (devices.Get (1));
127 
128  // Alternating access without immediate channel switch
129  const SchInfo schInfo = SchInfo (SCH1, false, EXTENDED_ALTERNATING);
130  Simulator::Schedule (Seconds (0.0), &WaveNetDevice::StartSch,sender,schInfo);
131  // An important point is that the receiver should also be assigned channel
132  // access for the same channel to receive packets.
133  Simulator::Schedule (Seconds (0.0), &WaveNetDevice::StartSch, receiver, schInfo);
134 
135  // send WSMP packets
136  // the first packet will be queued currently and be transmitted in next SCH interval
138  // the second packet will be queued currently and then be transmitted , because of in the CCH interval.
140  // the third packet will be dropped because of no channel access for SCH2.
142 
143  // release SCH access
146  // the fourth packet will be queued and be transmitted because of default CCH access assigned automatically.
148  // the fifth packet will be dropped because of no SCH1 access assigned
150 
151  Simulator::Stop (Seconds (5.0));
152  Simulator::Run ();
154 }
155 
156 void
157 WaveNetDeviceExample::SendIpPacket (uint32_t seq, bool ipv6)
158 {
159  Ptr<WaveNetDevice> sender = DynamicCast<WaveNetDevice> (devices.Get (0));
160  Ptr<WaveNetDevice> receiver = DynamicCast<WaveNetDevice> (devices.Get (1));
161  const Address dest = receiver->GetAddress ();
162  // send IPv4 packet or IPv6 packet
163  const static uint16_t IPv4_PROT_NUMBER = 0x0800;
164  const static uint16_t IPv6_PROT_NUMBER = 0x86DD;
165  uint16_t protocol = ipv6 ? IPv6_PROT_NUMBER : IPv4_PROT_NUMBER;
166  Ptr<Packet> p = Create<Packet> (100);
167  SeqTsHeader seqTs;
168  seqTs.SetSeq (seq);
169  p->AddHeader (seqTs);
170  sender->Send (p, dest, protocol);
171 }
172 
173 void
175 {
176  CreateWaveNodes ();
177  Ptr<WaveNetDevice> sender = DynamicCast<WaveNetDevice> (devices.Get (0));
178  Ptr<WaveNetDevice> receiver = DynamicCast<WaveNetDevice> (devices.Get (1));
179 
180  // Alternating access without immediate channel switch
181  const SchInfo schInfo = SchInfo (SCH1, false, EXTENDED_ALTERNATING);
182  Simulator::Schedule (Seconds (0.0), &WaveNetDevice::StartSch, sender, schInfo);
183  // An important point is that the receiver should also be assigned channel
184  // access for the same channel to receive packets.
185  Simulator::Schedule (Seconds (0.0), &WaveNetDevice::StartSch, receiver, schInfo);
186 
187  // both IPv4 and IPv6 packets below will not be inserted to internal queue because of no tx profile registered
190  //register txprofile
191  // IP packets will automatically be sent with txprofile parameter
192  const TxProfile txProfile = TxProfile (SCH1);
193  Simulator::Schedule (Seconds (2.0), &WaveNetDevice::RegisterTxProfile, sender, txProfile);
194  // both IPv4 and IPv6 packet are transmitted successfully
197  // unregister TxProfile or release channel access
201  // these packets will be dropped again because of no channel access assigned and no tx profile registered
204 
205  Simulator::Stop (Seconds (6.0));
206  Simulator::Run ();
208 }
209 
210 bool
212 {
213  std::cout << "receive a VSA management frame: recvTime = " << Now ().GetSeconds () << "s." << std::endl;
214  return true;
215 }
216 
217 void
219 {
220  CreateWaveNodes ();
221  Ptr<WaveNetDevice> sender = DynamicCast<WaveNetDevice> (devices.Get (0));
222  Ptr<WaveNetDevice> receiver = DynamicCast<WaveNetDevice> (devices.Get (1));
223 
224 // Alternating access without immediate channel switch for sender and receiver
225  const SchInfo schInfo = SchInfo (SCH1, false, EXTENDED_ALTERNATING);
226  Simulator::Schedule (Seconds (0.0), &WaveNetDevice::StartSch, sender, schInfo);
227  Simulator::Schedule (Seconds (0.0), &WaveNetDevice::StartSch, receiver, schInfo);
228 
229 // the peer address of VSA is broadcast address, and the repeat rate
230 // of VsaInfo is 100 per 5s, the VSA frame will be sent repeatedly.
231  Ptr<Packet> wsaPacket = Create<Packet> (100);
233  const VsaInfo vsaInfo = VsaInfo (dest, OrganizationIdentifier (), 0, wsaPacket, SCH1, 100, VSA_TRANSMIT_IN_BOTHI);
234  Simulator::Schedule (Seconds (1.0), &WaveNetDevice::StartVsa, sender, vsaInfo);
236 
237 // release alternating access
240 
241 // these WSA packets cannot be transmitted because of no channel access assigned
242  Simulator::Schedule (Seconds (5.0), &WaveNetDevice::StartVsa, sender, vsaInfo);
244 
245  Simulator::Stop (Seconds (6.0));
246  Simulator::Run ();
248 }
249 
250 int
251 main (int argc, char *argv[])
252 {
254  cmd.Parse (argc, argv);
255 
256  WaveNetDeviceExample example;
257  std::cout << "run WAVE WSMP routing service case:" << std::endl;
258  example.SendWsmpExample ();
259  std::cout << "run WAVE IP routing service case:" << std::endl;
260  //example.SendIpExample ();
261  std::cout << "run WAVE WSA routing service case:" << std::endl;
262  //example.SendWsaExample ();
263  return 0;
264 }
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:201
bool SendX(Ptr< Packet > packet, const Address &dest, uint32_t protocol, const TxInfo &txInfo)
static WaveHelper Default(void)
Definition: wave-helper.cc:238
virtual NetDeviceContainer Install(const WifiPhyHelper &phy, const WifiMacHelper &mac, NodeContainer c) const
Definition: wave-helper.cc:330
#define CCH
tuple cmd
Definition: second.py:35
void SetPcapDataLinkType(enum SupportedPcapDataLinkTypes dlt)
Set the data link type of PCAP traces to be used.
Definition: wifi-helper.cc:530
virtual void SetReceiveCallback(NetDevice::ReceiveCallback cb)
a polymophic address class
Definition: address.h:90
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:1238
#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:1489
#define SCH2
Parse command-line arguments.
Definition: command-line.h:205
static void Destroy(void)
Execute the events scheduled with ScheduleDestroy().
Definition: simulator.cc:165
bool StopSch(uint32_t channelNumber)
Packet header for UDP client/server application.
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:278
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:92
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:209
void SetSeq(uint32_t seq)
IEEE 802.11 Wireless LAN headers on packets.
Definition: wifi-helper.h:115
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.
void Parse(int argc, char *argv[])
Parse the program arguments.
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:340
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:257