A Discrete-Event Network Simulator
API
lr-wpan-phy.cc
Go to the documentation of this file.
1/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2011 The Boeing Company
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 * Author:
19 * Gary Pei <guangyu.pei@boeing.com>
20 * Sascha Alexander Jopen <jopen@cs.uni-bonn.de>
21 */
22#include "lr-wpan-phy.h"
23#include "lr-wpan-lqi-tag.h"
26#include "lr-wpan-error-model.h"
27#include "lr-wpan-net-device.h"
28#include <ns3/log.h>
29#include <ns3/abort.h>
30#include <ns3/simulator.h>
31#include <ns3/spectrum-value.h>
32#include <ns3/antenna-model.h>
33#include <ns3/mobility-model.h>
34#include <ns3/spectrum-channel.h>
35#include <ns3/packet.h>
36#include <ns3/packet-burst.h>
37#include <ns3/net-device.h>
38#include <ns3/random-variable-stream.h>
39#include <ns3/double.h>
40
41namespace ns3 {
42
43NS_LOG_COMPONENT_DEFINE ("LrWpanPhy");
44
46
47// Table 22 in section 6.4.1 of ieee802.15.4
48const uint32_t LrWpanPhy::aMaxPhyPacketSize = 127; // max PSDU in octets
49const uint32_t LrWpanPhy::aTurnaroundTime = 12; // RX-to-TX or TX-to-RX in symbol periods
50
51// IEEE802.15.4-2006 Table 2 in section 6.1.2 (kb/s and ksymbol/s)
52// The index follows LrWpanPhyOption
53const LrWpanPhyDataAndSymbolRates
54LrWpanPhy::dataSymbolRates[7] = { { 20.0, 20.0},
55 { 40.0, 40.0},
56 { 250.0, 12.5},
57 { 250.0, 50.0},
58 { 100.0, 25.0},
59 { 250.0, 62.5},
60 { 250.0, 62.5}};
61// IEEE802.15.4-2006 Table 19 and Table 20 in section 6.3.
62// The PHR is 1 octet and it follows phySymbolsPerOctet in Table 23
63// The index follows LrWpanPhyOption
64const LrWpanPhyPpduHeaderSymbolNumber
65LrWpanPhy::ppduHeaderSymbolNumbers[7] = { { 32.0, 8.0, 8.0},
66 { 32.0, 8.0, 8.0},
67 { 2.0, 1.0, 0.4},
68 { 6.0, 1.0, 1.6},
69 { 8.0, 2.0, 2.0},
70 { 8.0, 2.0, 2.0},
71 { 8.0, 2.0, 2.0}};
72
73TypeId
75{
76 static TypeId tid = TypeId ("ns3::LrWpanPhy")
78 .SetGroupName ("LrWpan")
79 .AddConstructor<LrWpanPhy> ()
80 .AddTraceSource ("TrxStateValue",
81 "The state of the transceiver",
83 "ns3::TracedValueCallback::LrWpanPhyEnumeration")
84 .AddTraceSource ("TrxState",
85 "The state of the transceiver",
87 "ns3::LrWpanPhy::StateTracedCallback")
88 .AddTraceSource ("PhyTxBegin",
89 "Trace source indicating a packet has "
90 "begun transmitting over the channel medium",
92 "ns3::Packet::TracedCallback")
93 .AddTraceSource ("PhyTxEnd",
94 "Trace source indicating a packet has been "
95 "completely transmitted over the channel.",
97 "ns3::Packet::TracedCallback")
98 .AddTraceSource ("PhyTxDrop",
99 "Trace source indicating a packet has been "
100 "dropped by the device during transmission",
102 "ns3::Packet::TracedCallback")
103 .AddTraceSource ("PhyRxBegin",
104 "Trace source indicating a packet has begun "
105 "being received from the channel medium by the device",
107 "ns3::Packet::TracedCallback")
108 .AddTraceSource ("PhyRxEnd",
109 "Trace source indicating a packet has been "
110 "completely received from the channel medium "
111 "by the device",
113 "ns3::Packet::SinrTracedCallback")
114 .AddTraceSource ("PhyRxDrop",
115 "Trace source indicating a packet has been "
116 "dropped by the device during reception",
118 "ns3::Packet::TracedCallback")
119 ;
120 return tid;
121}
122
124 : m_edRequest (),
125 m_setTRXState ()
126{
129
130 // default PHY PIB attributes
134 for (uint32_t i = 0; i < 32; i++)
135 {
137 }
139
141
145
146 // default -110 dBm in W for 2.4 GHz
147 m_rxSensitivity = pow (10.0, -106.58 / 10.0) / 1000.0;
152 m_signal = Create<LrWpanInterferenceHelper> (m_noise->GetSpectrumModel ());
154 Ptr<Packet> none_packet = 0;
156 m_currentRxPacket = std::make_pair (none_params, true);
157 m_currentTxPacket = std::make_pair (none_packet, true);
158 m_errorModel = 0;
159
160 m_random = CreateObject<UniformRandomVariable> ();
161 m_random->SetAttribute ("Min", DoubleValue (0.0));
162 m_random->SetAttribute ("Max", DoubleValue (1.0));
163
164
166}
167
169{
170}
171
172void
174{
175 NS_LOG_FUNCTION (this);
176
177 // Cancel pending transceiver state change, if one is in progress.
181
182 m_mobility = 0;
183 m_device = 0;
184 m_channel = 0;
185 m_txPsd = 0;
186 m_noise = 0;
187 m_signal = 0;
188 m_errorModel = 0;
189 m_pdDataIndicationCallback = MakeNullCallback< void, uint32_t, Ptr<Packet>, uint8_t > ();
190 m_pdDataConfirmCallback = MakeNullCallback< void, LrWpanPhyEnumeration > ();
191 m_plmeCcaConfirmCallback = MakeNullCallback< void, LrWpanPhyEnumeration > ();
192 m_plmeEdConfirmCallback = MakeNullCallback< void, LrWpanPhyEnumeration,uint8_t > ();
193 m_plmeGetAttributeConfirmCallback = MakeNullCallback< void, LrWpanPhyEnumeration, LrWpanPibAttributeIdentifier, LrWpanPhyPibAttributes* > ();
194 m_plmeSetTRXStateConfirmCallback = MakeNullCallback< void, LrWpanPhyEnumeration > ();
195 m_plmeSetAttributeConfirmCallback = MakeNullCallback< void, LrWpanPhyEnumeration, LrWpanPibAttributeIdentifier > ();
196
198}
199
202{
203 NS_LOG_FUNCTION (this);
204 return m_device;
205}
206
207
210{
211 NS_LOG_FUNCTION (this);
212 return m_mobility;
213}
214
215
216void
218{
219 NS_LOG_FUNCTION (this << d);
220 m_device = d;
221}
222
223
224void
226{
227 NS_LOG_FUNCTION (this << m);
228 m_mobility = m;
229}
230
231
232void
234{
235 NS_LOG_FUNCTION (this << c);
236 m_channel = c;
237}
238
239
242{
243 NS_LOG_FUNCTION (this);
244 return m_channel;
245}
246
247
250{
251 NS_LOG_FUNCTION (this);
252 if (m_txPsd)
253 {
254 return m_txPsd->GetSpectrumModel ();
255 }
256 else
257 {
258 return 0;
259 }
260}
261
264{
265 NS_LOG_FUNCTION (this);
266 return m_antenna;
267}
268
269void
271{
272 NS_LOG_FUNCTION (this << a);
273 m_antenna = a;
274}
275
276void
278{
279 NS_LOG_FUNCTION (this << spectrumRxParams);
281
282 if (!m_edRequest.IsExpired ())
283 {
284 // Update the average receive power during ED.
285 Time now = Simulator::Now ();
287 m_edPower.lastUpdate = now;
288 }
289
290 Ptr<LrWpanSpectrumSignalParameters> lrWpanRxParams = DynamicCast<LrWpanSpectrumSignalParameters> (spectrumRxParams);
291
292 if (lrWpanRxParams == 0)
293 {
295 m_signal->AddSignal (spectrumRxParams->psd);
296
297 // Update peak power if CCA is in progress.
298 if (!m_ccaRequest.IsExpired ())
299 {
301 if (m_ccaPeakPower < power)
302 {
303 m_ccaPeakPower = power;
304 }
305 }
306
307 Simulator::Schedule (spectrumRxParams->duration, &LrWpanPhy::EndRx, this, spectrumRxParams);
308 return;
309 }
310
311 Ptr<Packet> p = (lrWpanRxParams->packetBurst->GetPackets ()).front ();
312 NS_ASSERT (p != 0);
313
314 // Prevent PHY from receiving another packet while switching the transceiver state.
316 {
317 // The specification doesn't seem to refer to BUSY_RX, but vendor
318 // data sheets suggest that this is a substate of the RX_ON state
319 // that is entered after preamble detection when the digital receiver
320 // is enabled. Here, for now, we use BUSY_RX to mark the period between
321 // StartRx() and EndRx() states.
322
323 // We are going to BUSY_RX state when receiving the first bit of an SHR,
324 // as opposed to real receivers, which should go to this state only after
325 // successfully receiving the SHR.
326
327 // If synchronizing to the packet is possible, change to BUSY_RX state,
328 // otherwise drop the packet and stay in RX state. The actual synchronization
329 // is not modeled.
330
331 // Add any incoming packet to the current interference before checking the
332 // SINR.
333 NS_LOG_DEBUG (this << " receiving packet with power: " << 10 * log10 (LrWpanSpectrumValueHelper::TotalAvgPower (lrWpanRxParams->psd, m_phyPIBAttributes.phyCurrentChannel)) + 30 << "dBm");
334 m_signal->AddSignal (lrWpanRxParams->psd);
335 Ptr<SpectrumValue> interferenceAndNoise = m_signal->GetSignalPsd ();
336 *interferenceAndNoise -= *lrWpanRxParams->psd;
337 *interferenceAndNoise += *m_noise;
339
340 // Std. 802.15.4-2006, appendix E, Figure E.2
341 // At SNR < -5 the BER is less than 10e-1.
342 // It's useless to even *try* to decode the packet.
343 if (10 * log10 (sinr) > -5)
344 {
346 m_currentRxPacket = std::make_pair (lrWpanRxParams, false);
348
350 }
351 else
352 {
354 }
355 }
357 {
358 // Drop the new packet.
359 NS_LOG_DEBUG (this << " packet collision");
361
362 // Check if we correctly received the old packet up to now.
364
365 // Add the incoming packet to the current interference after we have
366 // checked for successful reception of the current packet for the time
367 // before the additional interference.
368 m_signal->AddSignal (lrWpanRxParams->psd);
369 }
370 else
371 {
372 // Simply drop the packet.
373 NS_LOG_DEBUG (this << " transceiver not in RX state");
375
376 // Add the signal power to the interference, anyway.
377 m_signal->AddSignal (lrWpanRxParams->psd);
378 }
379
380 // Update peak power if CCA is in progress.
381 if (!m_ccaRequest.IsExpired ())
382 {
384 if (m_ccaPeakPower < power)
385 {
386 m_ccaPeakPower = power;
387 }
388 }
389
390 // Always call EndRx to update the interference.
391 // \todo: Do we need to keep track of these events to unschedule them when disposing off the PHY?
392
393 Simulator::Schedule (spectrumRxParams->duration, &LrWpanPhy::EndRx, this, spectrumRxParams);
394}
395
396void
398{
399 // Calculate whether packet was lost.
402
403 // We are currently receiving a packet.
405 {
406 // NS_ASSERT (currentRxParams && !m_currentRxPacket.second);
407
408 Ptr<Packet> currentPacket = currentRxParams->packetBurst->GetPackets ().front ();
409 if (m_errorModel != 0)
410 {
411 // How many bits did we receive since the last calculation?
412 double t = (Simulator::Now () - m_rxLastUpdate).ToDouble (Time::MS);
413 uint32_t chunkSize = ceil (t * (GetDataOrSymbolRate (true) / 1000));
414 Ptr<SpectrumValue> interferenceAndNoise = m_signal->GetSignalPsd ();
415 *interferenceAndNoise -= *currentRxParams->psd;
416 *interferenceAndNoise += *m_noise;
418 double per = 1.0 - m_errorModel->GetChunkSuccessRate (sinr, chunkSize);
419
420 // The LQI is the total packet success rate scaled to 0-255.
421 // If not already set, initialize to 255.
423 currentPacket->PeekPacketTag (tag);
424 uint8_t lqi = tag.Get ();
425 tag.Set (lqi - (per * lqi));
426 currentPacket->ReplacePacketTag (tag);
427
428 if (m_random->GetValue () < per)
429 {
430 // The packet was destroyed, drop the packet after reception.
431 m_currentRxPacket.second = true;
432 }
433 }
434 else
435 {
436 NS_LOG_WARN ("Missing ErrorModel");
437 }
438 }
440}
441
442void
444{
445 NS_LOG_FUNCTION (this);
446
447 Ptr<LrWpanSpectrumSignalParameters> params = DynamicCast<LrWpanSpectrumSignalParameters> (par);
448
449 if (!m_edRequest.IsExpired ())
450 {
451 // Update the average receive power during ED.
452 Time now = Simulator::Now ();
454 m_edPower.lastUpdate = now;
455 }
456
458 if (currentRxParams == params)
459 {
461 }
462
463 // Update the interference.
464 m_signal->RemoveSignal (par->psd);
465
466 if (params == 0)
467 {
468 NS_LOG_LOGIC ("Node: " << m_device->GetAddress () << " Removing interferent: " << *(par->psd));
469 return;
470 }
471
472 // If this is the end of the currently received packet, check if reception was successful.
473 if (currentRxParams == params)
474 {
475 Ptr<Packet> currentPacket = currentRxParams->packetBurst->GetPackets ().front ();
476 NS_ASSERT (currentPacket != 0);
477
478 // If there is no error model attached to the PHY, we always report the maximum LQI value.
480 currentPacket->PeekPacketTag (tag);
481 m_phyRxEndTrace (currentPacket, tag.Get ());
482
483 if (!m_currentRxPacket.second)
484 {
485 // The packet was successfully received, push it up the stack.
487 {
488 m_pdDataIndicationCallback (currentPacket->GetSize (), currentPacket, tag.Get ());
489 }
490 }
491 else
492 {
493 // The packet was destroyed, drop it.
494 m_phyRxDropTrace (currentPacket);
495 }
497 m_currentRxPacket = std::make_pair (none, true);
498
499 // We may be waiting to apply a pending state change.
501 {
502 // Only change the state immediately, if the transceiver is not already
503 // switching the state.
504 if (!m_setTRXState.IsRunning ())
505 {
506 NS_LOG_LOGIC ("Apply pending state change to " << m_trxStatePending);
510 {
512 }
513 }
514 }
515 else
516 {
518 }
519 }
520}
521
522void
524{
525 NS_LOG_FUNCTION (this << psduLength << p);
526
527 if (psduLength > aMaxPhyPacketSize)
528 {
530 {
532 }
533 NS_LOG_DEBUG ("Drop packet because psduLength too long: " << psduLength);
534 return;
535 }
536
537 // Prevent PHY from sending a packet while switching the transceiver state.
538 if (!m_setTRXState.IsRunning ())
539 {
541 {
542 //send down
544
545 // Remove a possible LQI tag from a previous transmission of the packet.
546 LrWpanLqiTag lqiTag;
547 p->RemovePacketTag (lqiTag);
548
550 m_currentTxPacket.first = p;
551 m_currentTxPacket.second = false;
552
553 Ptr<LrWpanSpectrumSignalParameters> txParams = Create<LrWpanSpectrumSignalParameters> ();
554 txParams->duration = CalculateTxTime (p);
555 txParams->txPhy = GetObject<SpectrumPhy> ();
556 txParams->psd = m_txPsd;
557 txParams->txAntenna = m_antenna;
558 Ptr<PacketBurst> pb = CreateObject<PacketBurst> ();
559 pb->AddPacket (p);
560 txParams->packetBurst = pb;
561 m_channel->StartTx (txParams);
562 m_pdDataRequest = Simulator::Schedule (txParams->duration, &LrWpanPhy::EndTx, this);
564 return;
565 }
569 {
571 {
573 }
574 // Drop packet, hit PhyTxDrop trace
576 return;
577 }
578 else
579 {
580 NS_FATAL_ERROR ("This should be unreachable, or else state " << m_trxState << " should be added as a case");
581 }
582 }
583 else
584 {
585 // TODO: This error code is not covered by the standard.
586 // What is the correct behavior in this case?
588 {
590 }
591 // Drop packet, hit PhyTxDrop trace
593 return;
594 }
595}
596
597void
599{
600 NS_LOG_FUNCTION (this);
601
603 {
604 m_ccaPeakPower = 0.0;
605 Time ccaTime = Seconds (8.0 / GetDataOrSymbolRate (false));
607 }
608 else
609 {
611 {
613 {
615 }
616 else
617 {
619 }
620 }
621 }
622}
623
624void
626{
627 NS_LOG_FUNCTION (this);
629 {
630 // Average over the powers of all signals received until EndEd()
635 }
636 else
637 {
640 {
642 }
643
645 {
647 }
648 }
649}
650
651void
653{
654 NS_LOG_FUNCTION (this << id);
656
657 switch (id)
658 {
661 case phyTransmitPower:
662 case phyCCAMode:
663 case phyCurrentPage:
665 case phySHRDuration:
667 {
669 break;
670 }
671 default:
672 {
674 break;
675 }
676 }
678 {
679 LrWpanPhyPibAttributes retValue;
680 memcpy (&retValue, &m_phyPIBAttributes, sizeof(LrWpanPhyPibAttributes));
681 m_plmeGetAttributeConfirmCallback (status,id,&retValue);
682 }
683}
684
685// Section 6.2.2.7.3
686void
688{
689 NS_LOG_FUNCTION (this << state);
690
691 // Check valid states (Table 14)
693 && (state != IEEE_802_15_4_PHY_TRX_OFF)
695 && (state != IEEE_802_15_4_PHY_TX_ON) );
696
697 NS_LOG_LOGIC ("Trying to set m_trxState from " << m_trxState << " to " << state);
698 // this method always overrides previous state setting attempts
699 if (!m_setTRXState.IsExpired ())
700 {
701 if (m_trxStatePending == state)
702 {
703 // Simply wait for the ongoing state switch.
704 return;
705 }
706 else
707 {
708 NS_LOG_DEBUG ("Cancel m_setTRXState");
709 // Keep the transceiver state as the old state before the switching attempt.
711 }
712 }
714 {
716 }
717
718 if (state == m_trxState)
719 {
721 {
723 }
724 return;
725 }
726
727 if ( ((state == IEEE_802_15_4_PHY_RX_ON)
728 || (state == IEEE_802_15_4_PHY_TRX_OFF))
730 {
731 NS_LOG_DEBUG ("Phy is busy; setting state pending to " << state);
732 m_trxStatePending = state;
733 return; // Send PlmeSetTRXStateConfirm later
734 }
735
736 // specification talks about being in RX_ON and having received
737 // a valid SFD. Here, we are not modelling at that level of
738 // granularity, so we just test for BUSY_RX state (any part of
739 // a packet being actively received)
740 if (state == IEEE_802_15_4_PHY_TRX_OFF)
741 {
742 CancelEd (state);
743
745 && (m_currentRxPacket.first) && (!m_currentRxPacket.second))
746 {
747 NS_LOG_DEBUG ("Receiver has valid SFD; defer state change");
748 m_trxStatePending = state;
749 return; // Send PlmeSetTRXStateConfirm later
750 }
752 {
755 {
757 }
758 return;
759 }
760 }
761
762 if (state == IEEE_802_15_4_PHY_TX_ON)
763 {
764 CancelEd (state);
765
766 NS_LOG_DEBUG ("turn on PHY_TX_ON");
768 {
769 if (m_currentRxPacket.first)
770 {
771 //terminate reception if needed
772 //incomplete reception -- force packet discard
773 NS_LOG_DEBUG ("force TX_ON, terminate reception");
774 m_currentRxPacket.second = true;
775 }
776
777 // If CCA is in progress, cancel CCA and return BUSY.
778 if (!m_ccaRequest.IsExpired ())
779 {
782 {
784 }
785 }
786
788
789 // Delay for turnaround time
790 // TODO: Does it also take aTurnaroundTime to switch the transceiver state,
791 // even when the receiver is not busy? (6.9.2)
792 Time setTime = Seconds ( (double) aTurnaroundTime / GetDataOrSymbolRate (false));
794 return;
795 }
797 {
798 // We do NOT change the transceiver state here. We only report that
799 // the transceiver is already in TX_ON state.
801 {
803 }
804 return;
805 }
807 {
810 {
812 }
813 return;
814 }
815 }
816
818 {
820 {
821 NS_LOG_DEBUG ("force TRX_OFF, was already off");
822 }
823 else
824 {
825 NS_LOG_DEBUG ("force TRX_OFF, SUCCESS");
826 if (m_currentRxPacket.first)
827 { //terminate reception if needed
828 //incomplete reception -- force packet discard
829 NS_LOG_DEBUG ("force TRX_OFF, terminate reception");
830 m_currentRxPacket.second = true;
831 }
833 {
834 NS_LOG_DEBUG ("force TRX_OFF, terminate transmission");
835 m_currentTxPacket.second = true;
836 }
838 // Clear any other state
840 }
842 {
844 }
845 return;
846 }
847
848 if (state == IEEE_802_15_4_PHY_RX_ON)
849 {
851 {
852 // Turnaround delay
853 // TODO: Does it really take aTurnaroundTime to switch the transceiver state,
854 // even when the transmitter is not busy? (6.9.1)
856
857 Time setTime = Seconds ( (double) aTurnaroundTime / GetDataOrSymbolRate (false));
859 return;
860 }
862 {
864 {
866 }
867 return;
868 }
869 }
870
871 NS_FATAL_ERROR ("Unexpected transition from state " << m_trxState << " to state " << state);
872}
873
874bool
876{
877 NS_LOG_FUNCTION (this << channel);
878 bool retValue = false;
879
880 for (uint32_t i = 0; i < 32; i++)
881 {
882 if ((m_phyPIBAttributes.phyChannelsSupported[i] & (1 << channel)) != 0)
883 {
884 retValue = true;
885 break;
886 }
887 }
888
889 return retValue;
890}
891
892void
894 LrWpanPhyPibAttributes* attribute)
895{
896 NS_LOG_FUNCTION (this << id << attribute);
897 NS_ASSERT (attribute);
899
900 switch (id)
901 {
903 {
904 if (!ChannelSupported (attribute->phyCurrentChannel))
905 {
907 }
909 {
910 // Cancel a pending transceiver state change.
911 // Switch off the transceiver.
912 // TODO: Is switching off the transceiver the right choice?
915 {
919 {
921 }
922 }
923
924 // Any packet in transmission or reception will be corrupted.
925 if (m_currentRxPacket.first)
926 {
927 m_currentRxPacket.second = true;
928 }
929 if (PhyIsBusy ())
930 {
931 m_currentTxPacket.second = true;
933 m_currentTxPacket.first = 0;
935 {
937 }
938 }
943 }
944 break;
945 }
947 { // only the first element is considered in the array
948 if ((attribute->phyChannelsSupported[0] & 0xf8000000) != 0)
949 { //5 MSBs reserved
951 }
952 else
953 {
955 }
956 break;
957 }
958 case phyTransmitPower:
959 {
960 if (attribute->phyTransmitPower & 0xC0)
961 {
962 NS_LOG_LOGIC ("LrWpanPhy::PlmeSetAttributeRequest error - can not change read-only attribute bits.");
964 }
965 else
966 {
971 }
972 break;
973 }
974 case phyCCAMode:
975 {
976 if ((attribute->phyCCAMode < 1) || (attribute->phyCCAMode > 3))
977 {
979 }
980 else
981 {
983 }
984 break;
985 }
986 default:
987 {
989 break;
990 }
991 }
992
994 {
996 }
997}
998
999void
1001{
1002 NS_LOG_FUNCTION (this);
1004}
1005
1006void
1008{
1009 NS_LOG_FUNCTION (this);
1011}
1012
1013void
1015{
1016 NS_LOG_FUNCTION (this);
1018}
1019
1020void
1022{
1023 NS_LOG_FUNCTION (this);
1025}
1026
1027void
1029{
1030 NS_LOG_FUNCTION (this);
1032}
1033
1034void
1036{
1037 NS_LOG_FUNCTION (this);
1039}
1040
1041void
1043{
1044 NS_LOG_FUNCTION (this);
1046}
1047
1048void
1050{
1051 NS_LOG_LOGIC (this << " state: " << m_trxState << " -> " << newState);
1053 m_trxState = newState;
1054}
1055
1056bool
1058{
1059 NS_LOG_FUNCTION (this << m_trxState);
1063}
1064
1065void
1067{
1068 NS_LOG_FUNCTION (this);
1070
1071 if (!m_edRequest.IsExpired ())
1072 {
1075 {
1076 m_plmeEdConfirmCallback (state, 0);
1077 }
1078 }
1079}
1080
1081void
1083{
1084 NS_LOG_FUNCTION (this);
1085
1087
1088 uint8_t energyLevel;
1089
1090 // Per IEEE802.15.4-2006 sec 6.9.7
1091 double ratio = m_edPower.averagePower / m_rxSensitivity;
1092 ratio = 10.0 * log10 (ratio);
1093 if (ratio <= 10.0)
1094 { // less than 10 dB
1095 energyLevel = 0;
1096 }
1097 else if (ratio >= 40.0)
1098 { // less than 40 dB
1099 energyLevel = 255;
1100 }
1101 else
1102 {
1103 // in-between with linear increase per sec 6.9.7
1104 energyLevel = static_cast<uint8_t> (((ratio - 10.0) / 30.0) * 255.0);
1105 }
1106
1108 {
1110 }
1111}
1112
1113void
1115{
1116 NS_LOG_FUNCTION (this);
1118
1119 // Update peak power.
1121 if (m_ccaPeakPower < power)
1122 {
1123 m_ccaPeakPower = power;
1124 }
1125
1126 if (PhyIsBusy ())
1127 {
1128 sensedChannelState = IEEE_802_15_4_PHY_BUSY;
1129 }
1130 else if (m_phyPIBAttributes.phyCCAMode == 1)
1131 { //sec 6.9.9 ED detection
1132 // -- ED threshold at most 10 dB above receiver sensitivity.
1133 if (10 * log10 (m_ccaPeakPower / m_rxSensitivity) >= 10.0)
1134 {
1135 sensedChannelState = IEEE_802_15_4_PHY_BUSY;
1136 }
1137 else
1138 {
1139 sensedChannelState = IEEE_802_15_4_PHY_IDLE;
1140 }
1141 }
1142 else if (m_phyPIBAttributes.phyCCAMode == 2)
1143 {
1144 //sec 6.9.9 carrier sense only
1146 {
1147 // We currently do not model PPDU reception in detail. Instead we model
1148 // packet reception starting with the first bit of the preamble.
1149 // Therefore, this code will never be reached, as PhyIsBusy() would
1150 // already lead to a channel busy condition.
1151 // TODO: Change this, if we also model preamble and SFD detection.
1152 sensedChannelState = IEEE_802_15_4_PHY_BUSY;
1153 }
1154 else
1155 {
1156 sensedChannelState = IEEE_802_15_4_PHY_IDLE;
1157 }
1158 }
1159 else if (m_phyPIBAttributes.phyCCAMode == 3)
1160 { //sect 6.9.9 both
1161 if ((10 * log10 (m_ccaPeakPower / m_rxSensitivity) >= 10.0)
1163 {
1164 // Again, this code will never be reached, if we are already receiving
1165 // a packet, as PhyIsBusy() would already lead to a channel busy condition.
1166 // TODO: Change this, if we also model preamble and SFD detection.
1167 sensedChannelState = IEEE_802_15_4_PHY_BUSY;
1168 }
1169 else
1170 {
1171 sensedChannelState = IEEE_802_15_4_PHY_IDLE;
1172 }
1173 }
1174 else
1175 {
1176 NS_ASSERT_MSG (false, "Invalid CCA mode");
1177 }
1178
1179 NS_LOG_LOGIC (this << "channel sensed state: " << sensedChannelState);
1180
1182 {
1183 m_plmeCcaConfirmCallback (sensedChannelState);
1184 }
1185}
1186
1187void
1189{
1190 NS_LOG_FUNCTION (this);
1191
1195
1197 {
1199 }
1200}
1201
1202void
1204{
1205 NS_LOG_FUNCTION (this);
1206
1208
1209 if (m_currentTxPacket.second == false)
1210 {
1211 NS_LOG_DEBUG ("Packet successfully transmitted");
1214 {
1216 }
1217 }
1218 else
1219 {
1220 NS_LOG_DEBUG ("Packet transmission aborted");
1223 {
1224 // See if this is ever entered in another state
1227 }
1228 }
1229 m_currentTxPacket.first = 0;
1230 m_currentTxPacket.second = false;
1231
1232
1233 // We may be waiting to apply a pending state change.
1235 {
1236 // Only change the state immediately, if the transceiver is not already
1237 // switching the state.
1238 if (!m_setTRXState.IsRunning ())
1239 {
1240 NS_LOG_LOGIC ("Apply pending state change to " << m_trxStatePending);
1244 {
1246 }
1247 }
1248 }
1249 else
1250 {
1252 {
1254 }
1255 }
1256}
1257
1258Time
1260{
1261 NS_LOG_FUNCTION (this << packet);
1262
1263 bool isData = true;
1264 Time txTime = GetPpduHeaderTxTime ();
1265
1266 txTime += Seconds (packet->GetSize () * 8.0 / GetDataOrSymbolRate (isData));
1267
1268 return txTime;
1269}
1270
1271double
1273{
1274 NS_LOG_FUNCTION (this << isData);
1275
1276 double rate = 0.0;
1277
1279
1280 if (isData)
1281 {
1283 }
1284 else
1285 {
1287 }
1288
1289 return (rate * 1000.0);
1290}
1291
1292Time
1294{
1295 NS_LOG_FUNCTION (this);
1296
1297 bool isData = false;
1298 double totalPpduHdrSymbols;
1299
1301
1302 totalPpduHdrSymbols = ppduHeaderSymbolNumbers[m_phyOption].shrPreamble
1305
1306 return Seconds (totalPpduHdrSymbols / GetDataOrSymbolRate (isData));
1307}
1308
1309// IEEE802.15.4-2006 Table 2 in section 6.1.2
1310void
1312{
1313 NS_LOG_FUNCTION (this);
1314
1316
1318 {
1320 { // 868 MHz BPSK
1322 }
1324 { // 915 MHz BPSK
1326 }
1328 { // 2.4 GHz MHz O-QPSK
1330 }
1331 }
1332 else if (m_phyPIBAttributes.phyCurrentPage == 1)
1333 {
1335 { // 868 MHz ASK
1337 }
1339 { // 915 MHz ASK
1341 }
1342 }
1343 else if (m_phyPIBAttributes.phyCurrentPage == 2)
1344 {
1346 { // 868 MHz O-QPSK
1348 }
1350 { // 915 MHz O-QPSK
1352 }
1353 }
1354}
1355
1358{
1359 NS_LOG_FUNCTION (this);
1360 return m_phyOption;
1361}
1362
1363void
1365{
1366 NS_LOG_FUNCTION (this << txPsd);
1367 NS_ASSERT (txPsd);
1368 m_txPsd = txPsd;
1369 NS_LOG_INFO ("\t computed tx_psd: " << *txPsd << "\t stored tx_psd: " << *m_txPsd);
1370}
1371
1372void
1374{
1375 NS_LOG_FUNCTION (this << noisePsd);
1376 NS_LOG_INFO ("\t computed noise_psd: " << *noisePsd );
1377 NS_ASSERT (noisePsd);
1378 m_noise = noisePsd;
1379}
1380
1383{
1384 NS_LOG_FUNCTION (this);
1385 return m_noise;
1386}
1387
1388void
1390{
1391 NS_LOG_FUNCTION (this << e);
1392 NS_ASSERT (e);
1393 m_errorModel = e;
1394}
1395
1398{
1399 NS_LOG_FUNCTION (this);
1400 return m_errorModel;
1401}
1402
1403uint64_t
1405{
1406 NS_LOG_FUNCTION (this);
1408
1411}
1412
1413double
1415{
1416 NS_LOG_FUNCTION (this);
1418
1420}
1421
1422int8_t
1424{
1426
1427 // The nominal Tx power is stored in the PIB as a 6-bit
1428 // twos-complement, signed number.
1429
1430 // The 5 LSBs can be copied - as their representation
1431 // is the same for unsigned and signed integers.
1432 int8_t nominalTxPower = phyTransmitPower & 0x1F;
1433
1434 // Now check the 6th LSB (the "sign" bit).
1435 // It's a twos-complement format, so the "sign"
1436 // bit represents -2^5 = -32.
1437 if (phyTransmitPower & 0x20)
1438 {
1439 nominalTxPower -= 32;
1440 }
1441 return nominalTxPower;
1442}
1443
1444
1445int64_t
1447{
1448 NS_LOG_FUNCTION (this);
1449 m_random->SetStream (stream);
1450 return 1;
1451}
1452
1453} // namespace ns3
#define max(a, b)
Definition: 80211b.c:43
bool IsNull(void) const
Check for null implementation.
Definition: callback.h:1386
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition: double.h:41
bool IsRunning(void) const
This method is syntactic sugar for !IsExpired().
Definition: event-id.cc:71
void Cancel(void)
This method is syntactic sugar for the ns3::Simulator::Cancel method.
Definition: event-id.cc:53
bool IsExpired(void) const
This method is syntactic sugar for the ns3::Simulator::IsExpired method.
Definition: event-id.cc:65
Represent the LQI (Link Quality Estination).
void Set(uint8_t lqi)
Set the LQI to the given value.
uint8_t Get(void) const
Get the LQI value.
Make LrWpanPhy a SpectrumPhy so we can enable the eventual modeling of device interference.
Definition: lr-wpan-phy.h:248
virtual void StartRx(Ptr< SpectrumSignalParameters > params)
Notify the SpectrumPhy instance of an incoming waveform.
Definition: lr-wpan-phy.cc:277
Ptr< const SpectrumValue > m_noise
The spectral density for for the noise.
Definition: lr-wpan-phy.h:724
void SetPdDataConfirmCallback(PdDataConfirmCallback c)
set the callback for the end of a TX, as part of the interconnections betweenthe PHY and the MAC.
EventId m_setTRXState
Scheduler event of a currently running deferred transceiver state switch.
Definition: lr-wpan-phy.h:852
static const uint32_t aMaxPhyPacketSize
The maximum packet size accepted by the PHY.
Definition: lr-wpan-phy.h:262
static TypeId GetTypeId(void)
Get the type ID.
Definition: lr-wpan-phy.cc:74
bool ChannelSupported(uint8_t channel)
Check if the given channel is supported by the PHY.
Definition: lr-wpan-phy.cc:875
Ptr< SpectrumValue > m_txPsd
The transmit power spectral density.
Definition: lr-wpan-phy.h:719
void ChangeTrxState(LrWpanPhyEnumeration newState)
Change the PHY state to the given new state, firing the state change trace.
PlmeSetAttributeConfirmCallback m_plmeSetAttributeConfirmCallback
This callback is used to report attribute set results back to the MAC.
Definition: lr-wpan-phy.h:789
void SetPlmeGetAttributeConfirmCallback(PlmeGetAttributeConfirmCallback c)
set the callback for the end of an GetAttribute, as part of the interconnections betweenthe PHY and t...
Time CalculateTxTime(Ptr< const Packet > packet)
Calculate the time required for sending the given packet, including preamble, SFD and PHR.
Ptr< AntennaModel > m_antenna
The antenna used by the transceiver.
Definition: lr-wpan-phy.h:714
double GetDataOrSymbolRate(bool isData)
implement PLME SetAttribute confirm SAP bit rate is in kbit/s.
void SetPlmeSetTRXStateConfirmCallback(PlmeSetTRXStateConfirmCallback c)
set the callback for the end of an SetTRXState, as part of the interconnections betweenthe PHY and th...
void PlmeSetTRXStateRequest(LrWpanPhyEnumeration state)
IEEE 802.15.4-2006 section 6.2.2.7 PLME-SET-TRX-STATE.request Set PHY state.
Definition: lr-wpan-phy.cc:687
void SetTxPowerSpectralDensity(Ptr< SpectrumValue > txPsd)
Set the Power Spectral Density of outgoing signals in W/Hz.
static const LrWpanPhyDataAndSymbolRates dataSymbolRates[7]
The data and symbol rates for the different PHY options.
Definition: lr-wpan-phy.h:499
void PlmeGetAttributeRequest(LrWpanPibAttributeIdentifier id)
IEEE 802.15.4-2006 section 6.2.2.5 PLME-GET.request Get attributes per definition from Table 23 in se...
Definition: lr-wpan-phy.cc:652
Ptr< UniformRandomVariable > m_random
Uniform random variable stream.
Definition: lr-wpan-phy.h:862
TracedValue< LrWpanPhyEnumeration > m_trxState
The current transceiver state.
Definition: lr-wpan-phy.h:740
void PlmeCcaRequest(void)
IEEE 802.15.4-2006 section 6.2.2.1 PLME-CCA.request Perform a CCA per section 6.9....
Definition: lr-wpan-phy.cc:598
void PlmeEdRequest(void)
IEEE 802.15.4-2006 section 6.2.2.3 PLME-ED.request Perform an ED per section 6.9.7.
Definition: lr-wpan-phy.cc:625
TracedCallback< Ptr< const Packet > > m_phyTxEndTrace
The trace source fired when a packet ends the transmission process on the medium.
Definition: lr-wpan-phy.h:635
void SetPlmeEdConfirmCallback(PlmeEdConfirmCallback c)
set the callback for the end of an ED, as part of the interconnections betweenthe PHY and the MAC.
void EndRx(Ptr< SpectrumSignalParameters > params)
Finish the reception of a frame.
Definition: lr-wpan-phy.cc:443
PlmeCcaConfirmCallback m_plmeCcaConfirmCallback
This callback is used to report CCA status to the MAC or CSMA/CA.
Definition: lr-wpan-phy.h:765
Ptr< NetDevice > m_device
The configured net device.
Definition: lr-wpan-phy.h:704
void PdDataRequest(const uint32_t psduLength, Ptr< Packet > p)
IEEE 802.15.4-2006 section 6.2.1.1 PD-DATA.request Request to transfer MPDU from MAC (transmitting)
Definition: lr-wpan-phy.cc:523
LrWpanPhyOption GetMyPhyOption(void)
Get the currently configured PHY option.
Ptr< SpectrumChannel > GetChannel(void)
Get the currently attached channel.
Definition: lr-wpan-phy.cc:241
Ptr< LrWpanErrorModel > m_errorModel
The error model describing the bit and packet error rates.
Definition: lr-wpan-phy.h:729
virtual ~LrWpanPhy(void)
Definition: lr-wpan-phy.cc:168
Ptr< LrWpanErrorModel > GetErrorModel(void) const
get the error model in use
PlmeEdConfirmCallback m_plmeEdConfirmCallback
This callback is used to report ED status to the MAC.
Definition: lr-wpan-phy.h:771
std::pair< Ptr< LrWpanSpectrumSignalParameters >, bool > m_currentRxPacket
Statusinformation of the currently received packet.
Definition: lr-wpan-phy.h:829
EventId m_ccaRequest
Scheduler event of a currently running CCA request.
Definition: lr-wpan-phy.h:842
virtual Ptr< const SpectrumModel > GetRxSpectrumModel(void) const
Definition: lr-wpan-phy.cc:249
void SetMyPhyOption(void)
Configure the PHY option according to the current channel and channel page.
uint64_t GetPhySHRDuration(void) const
Get the duration of the SHR (preamble and SFD) in symbols, depending on the currently selected channe...
LrWpanEdPower m_edPower
Helper value for tracking the average power during ED.
Definition: lr-wpan-phy.h:799
Ptr< const SpectrumValue > GetNoisePowerSpectralDensity(void)
Get the noise power spectral density.
PacketAndStatus m_currentTxPacket
Statusinformation of the currently transmitted packet.
Definition: lr-wpan-phy.h:837
TracedCallback< Ptr< const Packet >, double > m_phyRxEndTrace
The trace source fired when a packet ends the reception process from the medium.
Definition: lr-wpan-phy.h:659
Ptr< SpectrumChannel > m_channel
The channel attached to this transceiver.
Definition: lr-wpan-phy.h:709
PdDataConfirmCallback m_pdDataConfirmCallback
This callback is used to report packet transmission status to the MAC layer.
Definition: lr-wpan-phy.h:759
TracedCallback< Ptr< const Packet > > m_phyTxBeginTrace
The trace source fired when a packet begins the transmission process on the medium.
Definition: lr-wpan-phy.h:627
Ptr< MobilityModel > m_mobility
The mobility model used by the PHY.
Definition: lr-wpan-phy.h:699
double m_ccaPeakPower
Helper value for the peak power value during CCA.
Definition: lr-wpan-phy.h:804
LrWpanPhyOption m_phyOption
The currently configured PHY type.
Definition: lr-wpan-phy.h:794
EventId m_edRequest
Scheduler event of a currently running ED request.
Definition: lr-wpan-phy.h:847
LrWpanPhyPibAttributes m_phyPIBAttributes
The current PHY PIB attributes.
Definition: lr-wpan-phy.h:734
double m_rxSensitivity
The receiver sensitivity.
Definition: lr-wpan-phy.h:809
static const uint32_t aTurnaroundTime
The turnaround time for switching the transceiver from RX to TX or vice versa.
Definition: lr-wpan-phy.h:269
LrWpanPhyEnumeration m_trxStatePending
The next pending state to applied after the current action of the PHY is completed.
Definition: lr-wpan-phy.h:746
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
void CheckInterference(void)
Check if the interference destroys a frame currently received.
Definition: lr-wpan-phy.cc:397
Time GetPpduHeaderTxTime(void)
Calculate the time required for sending the PPDU header, that is the preamble, SFD and PHR.
Ptr< LrWpanInterferenceHelper > m_signal
The accumulated signals currently received by the transceiver, including the signal of a possibly rec...
Definition: lr-wpan-phy.h:816
LrWpanPhy(void)
Default constructor.
Definition: lr-wpan-phy.cc:123
int8_t GetNominalTxPowerFromPib(uint8_t phyTransmitPower)
Calculates the nominal transmit power of the device in decibels relative to 1 mW according to the rep...
PdDataIndicationCallback m_pdDataIndicationCallback
This callback is used to notify incoming packets to the MAC layer.
Definition: lr-wpan-phy.h:753
void SetMobility(Ptr< MobilityModel > m)
Set the mobility model associated with this device.
Definition: lr-wpan-phy.cc:225
void SetErrorModel(Ptr< LrWpanErrorModel > e)
set the error model to use
TracedCallback< Ptr< const Packet > > m_phyRxDropTrace
The trace source fired when the phy layer drops a packet it has received.
Definition: lr-wpan-phy.h:666
void EndCca(void)
Called at the end of the CCA.
void EndSetTRXState(void)
Called after applying a deferred transceiver state switch.
PlmeSetTRXStateConfirmCallback m_plmeSetTRXStateConfirmCallback
This callback is used to report transceiver state change status to the MAC.
Definition: lr-wpan-phy.h:783
void PlmeSetAttributeRequest(LrWpanPibAttributeIdentifier id, LrWpanPhyPibAttributes *attribute)
IEEE 802.15.4-2006 section 6.2.2.9 PLME-SET.request Set attributes per definition from Table 23 in se...
Definition: lr-wpan-phy.cc:893
PlmeGetAttributeConfirmCallback m_plmeGetAttributeConfirmCallback
This callback is used to report requested attribute values back to the MAC.
Definition: lr-wpan-phy.h:777
bool PhyIsBusy(void) const
Check if the PHY is busy, which is the case if the PHY is currently sending or receiving a frame.
void SetPdDataIndicationCallback(PdDataIndicationCallback c)
set the callback for the end of a RX, as part of the interconnections betweenthe PHY and the MAC.
EventId m_pdDataRequest
Scheduler event of a currently running data transmission request.
Definition: lr-wpan-phy.h:857
TracedCallback< Ptr< const Packet > > m_phyTxDropTrace
The trace source fired when the phy layer drops a packet as it tries to transmit it.
Definition: lr-wpan-phy.h:643
virtual void DoDispose(void)
Destructor implementation.
Definition: lr-wpan-phy.cc:173
TracedCallback< Ptr< const Packet > > m_phyRxBeginTrace
The trace source fired when a packet begins the reception process from the medium.
Definition: lr-wpan-phy.h:651
void SetDevice(Ptr< NetDevice > d)
Set the associated NetDevice instance.
Definition: lr-wpan-phy.cc:217
void SetPlmeSetAttributeConfirmCallback(PlmeSetAttributeConfirmCallback c)
set the callback for the end of an SetAttribute, as part of the interconnections betweenthe PHY and t...
Time m_rxLastUpdate
Timestamp of the last calculation of the PER of a packet currently received.
Definition: lr-wpan-phy.h:821
Ptr< MobilityModel > GetMobility(void) const
Get the associated MobilityModel instance.
Definition: lr-wpan-phy.cc:209
void SetChannel(Ptr< SpectrumChannel > c)
Set the channel attached to this device.
Definition: lr-wpan-phy.cc:233
static const LrWpanPhyPpduHeaderSymbolNumber ppduHeaderSymbolNumbers[7]
The preamble, SFD, and PHR lengths in symbols for the different PHY options.
Definition: lr-wpan-phy.h:504
Ptr< Object > GetAntenna(void) const
Get the AntennaModel used by this SpectrumPhy instance for transmission and/or reception.
Definition: lr-wpan-phy.cc:263
TracedCallback< Time, LrWpanPhyEnumeration, LrWpanPhyEnumeration > m_trxStateLogger
The trace source fired when the phy layer changes the transceiver state.
Definition: lr-wpan-phy.h:676
void CancelEd(LrWpanPhyEnumeration state)
Cancel an ongoing ED procedure.
void EndEd(void)
Called at the end of the ED procedure.
void SetAntenna(Ptr< AntennaModel > a)
Set the attached antenna.
Definition: lr-wpan-phy.cc:270
double GetPhySymbolsPerOctet(void) const
Get the number of symbols per octet, depending on the currently selected channel.
void SetNoisePowerSpectralDensity(Ptr< const SpectrumValue > noisePsd)
Set the noise power spectral density.
void SetPlmeCcaConfirmCallback(PlmeCcaConfirmCallback c)
set the callback for the end of a CCA, as part of the interconnections betweenthe PHY and the MAC.
Ptr< NetDevice > GetDevice(void) const
Get the associated NetDevice instance.
Definition: lr-wpan-phy.cc:201
void EndTx(void)
Finish the transmission of a frame.
This class defines all functions to create spectrum model for LrWpan.
Ptr< SpectrumValue > CreateNoisePowerSpectralDensity(uint32_t channel)
create spectrum value for noise
static double TotalAvgPower(Ptr< const SpectrumValue > psd, uint32_t channel)
total average power of the signal is the integral of the PSD using the limits of the given channel
Ptr< SpectrumValue > CreateTxPowerSpectralDensity(double txPower, uint32_t channel)
create spectrum value
virtual Address GetAddress(void) const =0
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Definition: object-base.cc:256
virtual void DoDispose(void)
Destructor implementation.
Definition: object.cc:346
bool RemovePacketTag(Tag &tag)
Remove a packet tag.
Definition: packet.cc:963
bool PeekPacketTag(Tag &tag) const
Search a matching tag and call Tag::Deserialize if it is found.
Definition: packet.cc:978
bool ReplacePacketTag(Tag &tag)
Replace the value of a packet tag.
Definition: packet.cc:970
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:856
void SetStream(int64_t stream)
Specifies the stream number for the RngStream.
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Definition: simulator.h:556
static Time Now(void)
Return the current simulation virtual time.
Definition: simulator.cc:195
Abstract base class for Spectrum-aware PHY layers.
Definition: spectrum-phy.h:47
Ptr< const SpectrumModel > GetSpectrumModel() const
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
int64_t GetTimeStep(void) const
Get the raw time value, in the current resolution unit.
Definition: nstime.h:415
@ MS
millisecond
Definition: nstime.h:115
a unique identifier for an interface.
Definition: type-id.h:59
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:922
double GetValue(double min, double max)
Get the next random value, as a double in the specified range .
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition: assert.h:67
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition: assert.h:88
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:165
#define NS_ABORT_IF(cond)
Abnormal program termination if a condition is true.
Definition: abort.h:77
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:273
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:289
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
Definition: log.h:265
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:281
LrWpanPhyOption
This Phy option will be used to index various Tables in IEEE802.15.4-2006.
Definition: lr-wpan-phy.h:88
LrWpanPhyEnumeration
IEEE802.15.4-2006 PHY Emumerations Table 18 in section 6.2.3.
Definition: lr-wpan-phy.h:106
LrWpanPibAttributeIdentifier
IEEE802.15.4-2006 PHY PIB Attribute Identifiers Table 23 in section 6.4.2.
Definition: lr-wpan-phy.h:141
@ IEEE_802_15_4_868MHZ_BPSK
Definition: lr-wpan-phy.h:89
@ IEEE_802_15_4_915MHZ_OQPSK
Definition: lr-wpan-phy.h:94
@ IEEE_802_15_4_868MHZ_ASK
Definition: lr-wpan-phy.h:91
@ IEEE_802_15_4_868MHZ_OQPSK
Definition: lr-wpan-phy.h:93
@ IEEE_802_15_4_2_4GHZ_OQPSK
Definition: lr-wpan-phy.h:95
@ IEEE_802_15_4_915MHZ_ASK
Definition: lr-wpan-phy.h:92
@ IEEE_802_15_4_915MHZ_BPSK
Definition: lr-wpan-phy.h:90
@ IEEE_802_15_4_INVALID_PHY_OPTION
Definition: lr-wpan-phy.h:96
@ IEEE_802_15_4_PHY_BUSY_RX
Definition: lr-wpan-phy.h:108
@ IEEE_802_15_4_PHY_UNSUPPORTED_ATTRIBUTE
Definition: lr-wpan-phy.h:117
@ IEEE_802_15_4_PHY_BUSY
Definition: lr-wpan-phy.h:107
@ IEEE_802_15_4_PHY_SUCCESS
Definition: lr-wpan-phy.h:114
@ IEEE_802_15_4_PHY_UNSPECIFIED
Definition: lr-wpan-phy.h:119
@ IEEE_802_15_4_PHY_TRX_OFF
Definition: lr-wpan-phy.h:115
@ IEEE_802_15_4_PHY_FORCE_TRX_OFF
Definition: lr-wpan-phy.h:110
@ IEEE_802_15_4_PHY_BUSY_TX
Definition: lr-wpan-phy.h:109
@ IEEE_802_15_4_PHY_RX_ON
Definition: lr-wpan-phy.h:113
@ IEEE_802_15_4_PHY_TX_ON
Definition: lr-wpan-phy.h:116
@ IEEE_802_15_4_PHY_INVALID_PARAMETER
Definition: lr-wpan-phy.h:112
@ IEEE_802_15_4_PHY_IDLE
Definition: lr-wpan-phy.h:111
@ phyMaxFrameDuration
Definition: lr-wpan-phy.h:147
@ phyChannelsSupported
Definition: lr-wpan-phy.h:143
@ phyCurrentChannel
Definition: lr-wpan-phy.h:142
@ phyCurrentPage
Definition: lr-wpan-phy.h:146
@ phyCCAMode
Definition: lr-wpan-phy.h:145
@ phySymbolsPerOctet
Definition: lr-wpan-phy.h:149
@ phySHRDuration
Definition: lr-wpan-phy.h:148
@ phyTransmitPower
Definition: lr-wpan-phy.h:144
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1244
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
channel
Definition: third.py:92
double averagePower
Average measured power.
Definition: lr-wpan-phy.h:52
Time lastUpdate
Last update time.
Definition: lr-wpan-phy.h:53
Time measurementLength
Total measurement period.
Definition: lr-wpan-phy.h:54
double symbolRate
symbol rate
Definition: lr-wpan-phy.h:66
IEEE802.15.4-2006 PHY PIB Attributes Table 23 in section 6.4.2.
Definition: lr-wpan-phy.h:158
uint32_t phyChannelsSupported[32]
BitField representing the available channels supported by a channel page.
Definition: lr-wpan-phy.h:160
uint8_t phyTransmitPower
2 MSB: tolerance on the transmit power, 6 LSB: Tx power in dBm relative to 1mW (signed int in 2-compl...
Definition: lr-wpan-phy.h:161
uint8_t phyCCAMode
CCA mode.
Definition: lr-wpan-phy.h:162
uint8_t phyCurrentChannel
The RF channel to use.
Definition: lr-wpan-phy.h:159
uint32_t phyCurrentPage
Current channel page.
Definition: lr-wpan-phy.h:163
double shrSfd
Number of symbols for the SHR SFD.
Definition: lr-wpan-phy.h:78
double phr
Number of symbols for the PHR.
Definition: lr-wpan-phy.h:79
double shrPreamble
Number of symbols for the SHR preamble.
Definition: lr-wpan-phy.h:77