aboutsummaryrefslogtreecommitdiffstats
path: root/emu-radio/ns3-patch/wifi/model/yans-wifi-phy.h
diff options
context:
space:
mode:
Diffstat (limited to 'emu-radio/ns3-patch/wifi/model/yans-wifi-phy.h')
-rw-r--r--emu-radio/ns3-patch/wifi/model/yans-wifi-phy.h615
1 files changed, 615 insertions, 0 deletions
diff --git a/emu-radio/ns3-patch/wifi/model/yans-wifi-phy.h b/emu-radio/ns3-patch/wifi/model/yans-wifi-phy.h
new file mode 100644
index 00000000..5becc1e7
--- /dev/null
+++ b/emu-radio/ns3-patch/wifi/model/yans-wifi-phy.h
@@ -0,0 +1,615 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2005,2006 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ * Ghada Badawy <gbadawy@gmail.com>
+ * Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#ifndef YANS_WIFI_PHY_H
+#define YANS_WIFI_PHY_H
+
+#include <stdint.h>
+#include "ns3/callback.h"
+#include "ns3/event-id.h"
+#include "ns3/packet.h"
+#include "ns3/object.h"
+#include "ns3/traced-callback.h"
+#include "ns3/nstime.h"
+#include "ns3/ptr.h"
+#include "ns3/random-variable-stream.h"
+#include "ns3/mobility-model.h"
+#include "wifi-phy.h"
+#include "wifi-mode.h"
+#include "wifi-preamble.h"
+#include "wifi-phy-standard.h"
+#include "interference-helper.h"
+
+//****for new tags*********
+#include "ns3/snr-tag.h"
+
+
+namespace ns3 {
+
+#define VHT_PHY 126
+#define HT_PHY 127
+
+class YansWifiChannel;
+class WifiPhyStateHelper;
+
+/**
+ * @brief tags for RSSI
+ */
+
+class RssiTag : public SnrTag
+{
+public:
+ static TypeId GetTypeId (void);
+
+ virtual TypeId GetInstanceTypeId (void) const;
+ /**
+ * Create a SnrTag with the default snr 0
+ */
+ RssiTag ();
+
+ /**
+ * Create a SnrTag with the given snr value
+ * \param snr the given SNR value
+ */
+ RssiTag (double snr);
+};
+
+
+
+
+/**
+ * \brief 802.11 PHY layer model
+ * \ingroup wifi
+ *
+ * This PHY implements a model of 802.11a. The model
+ * implemented here is based on the model described
+ * in "Yet Another Network Simulator",
+ * (http://cutebugs.net/files/wns2-yans.pdf).
+ *
+ *
+ * This PHY model depends on a channel loss and delay
+ * model as provided by the ns3::PropagationLossModel
+ * and ns3::PropagationDelayModel classes, both of which are
+ * members of the ns3::YansWifiChannel class.
+ */
+class YansWifiPhy : public WifiPhy
+{
+public:
+ static TypeId GetTypeId (void);
+
+ YansWifiPhy ();
+ virtual ~YansWifiPhy ();
+
+ /**
+ * Set the YansWifiChannel this YansWifiPhy is to be connected to.
+ *
+ * \param channel the YansWifiChannel this YansWifiPhy is to be connected to
+ */
+ void SetChannel (Ptr<YansWifiChannel> channel);
+ /**
+ * Set the current channel number.
+ *
+ * \param id the channel number
+ */
+ void SetChannelNumber (uint16_t id);
+ /**
+ * Return the current channel number.
+ *
+ * \return the current channel number
+ */
+ uint16_t GetChannelNumber (void) const;
+ /**
+ * \return the required time for channel switch operation of this WifiPhy
+ */
+ Time GetChannelSwitchDelay (void) const;
+ /**
+ * Return current center channel frequency in MHz.
+ *
+ * \return the current center channel frequency in MHz
+ */
+ double GetChannelFrequencyMhz () const;
+
+ /**
+ * Starting receiving the plcp of a packet (i.e. the first bit of the preamble has arrived).
+ *
+ * \param packet the arriving packet
+ * \param rxPowerDbm the receive power in dBm
+ * \param txVector the TXVECTOR of the arriving packet
+ * \param preamble the preamble of the arriving packet
+ * \param aMpdu the type of the packet (0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU and 2 is the last MPDU in an A-MPDU)
+ * and the A-MPDU reference number (must be a different value for each A-MPDU but the same for each subframe within one A-MPDU)
+ * \param rxDuration the duration needed for the reception of the packet
+ */
+ void StartReceivePreambleAndHeader (Ptr<Packet> packet,
+ double rxPowerDbm,
+ WifiTxVector txVector,
+ WifiPreamble preamble,
+ struct mpduInfo aMpdu,
+ Time rxDuration);
+ /**
+ * Starting receiving the payload of a packet (i.e. the first bit of the packet has arrived).
+ *
+ * \param packet the arriving packet
+ * \param txVector the TXVECTOR of the arriving packet
+ * \param preamble the preamble of the arriving packet
+ * \param aMpdu the type of the packet (0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU and 2 is the last MPDU in an A-MPDU)
+ * and the A-MPDU reference number (must be a different value for each A-MPDU but the same for each subframe within one A-MPDU)
+ * \param event the corresponding event of the first time the packet arrives
+ */
+ void StartReceivePacket (Ptr<Packet> packet,
+ WifiTxVector txVector,
+ WifiPreamble preamble,
+ struct mpduInfo aMpdu,
+ Ptr<InterferenceHelper::Event> event);
+
+ /**
+ * Sets the RX loss (dB) in the Signal-to-Noise-Ratio due to non-idealities in the receiver.
+ *
+ * \param noiseFigureDb noise figure in dB
+ */
+ void SetRxNoiseFigure (double noiseFigureDb);
+ /**
+ * Sets the minimum available transmission power level (dBm).
+ *
+ * \param start the minimum transmission power level (dBm)
+ */
+ void SetTxPowerStart (double start);
+ /**
+ * Sets the maximum available transmission power level (dBm).
+ *
+ * \param end the maximum transmission power level (dBm)
+ */
+ void SetTxPowerEnd (double end);
+ /**
+ * Sets the number of transmission power levels available between the
+ * minimum level and the maximum level. Transmission power levels are
+ * equally separated (in dBm) with the minimum and the maximum included.
+ *
+ * \param n the number of available levels
+ */
+ void SetNTxPower (uint32_t n);
+ /**
+ * Sets the transmission gain (dB).
+ *
+ * \param gain the transmission gain in dB
+ */
+ void SetTxGain (double gain);
+ /**
+ * Sets the reception gain (dB).
+ *
+ * \param gain the reception gain in dB
+ */
+ void SetRxGain (double gain);
+ /**
+ * Sets the energy detection threshold (dBm).
+ * The energy of a received signal should be higher than
+ * this threshold (dbm) to allow the PHY layer to detect the signal.
+ *
+ * \param threshold the energy detction threshold in dBm
+ */
+ void SetEdThreshold (double threshold);
+ /**
+ * Sets the CCA threshold (dBm). The energy of a received signal
+ * should be higher than this threshold to allow the PHY
+ * layer to declare CCA BUSY state.
+ *
+ * \param threshold the CCA threshold in dBm
+ */
+ void SetCcaMode1Threshold (double threshold);
+ /**
+ * Sets the error rate model.
+ *
+ * \param rate the error rate model
+ */
+ void SetErrorRateModel (Ptr<ErrorRateModel> rate);
+ /**
+ * Sets the device this PHY is associated with.
+ *
+ * \param device the device this PHY is associated with
+ */
+ void SetDevice (Ptr<NetDevice> device);
+ /**
+ * \brief assign a mobility model to this device
+ *
+ * This method allows a user to specify a mobility model that should be
+ * associated with this physical layer. Calling this method is optional
+ * and only necessary if the user wants to override the mobility model
+ * that is aggregated to the node.
+ *
+ * \param mobility the mobility model this PHY is associated with
+ */
+ void SetMobility (Ptr<MobilityModel> mobility);
+ /**
+ * Return the RX noise figure (dBm).
+ *
+ * \return the RX noise figure in dBm
+ */
+ double GetRxNoiseFigure (void) const;
+ /**
+ * Return the transmission gain (dB).
+ *
+ * \return the transmission gain in dB
+ */
+ double GetTxGain (void) const;
+ /**
+ * Return the reception gain (dB).
+ *
+ * \return the reception gain in dB
+ */
+ double GetRxGain (void) const;
+ /**
+ * Return the energy detection threshold (dBm).
+ *
+ * \return the energy detection threshold in dBm
+ */
+ double GetEdThreshold (void) const;
+ /**
+ * Return the CCA threshold (dBm).
+ *
+ * \return the CCA threshold in dBm
+ */
+ double GetCcaMode1Threshold (void) const;
+ /**
+ * Return the error rate model this PHY is using.
+ *
+ * \return the error rate model this PHY is using
+ */
+ Ptr<ErrorRateModel> GetErrorRateModel (void) const;
+ /**
+ * Return the device this PHY is associated with
+ *
+ * \return the device this PHY is associated with
+ */
+ Ptr<NetDevice> GetDevice (void) const;
+ /**
+ * Return the mobility model this PHY is associated with.
+ * This method will return either the mobility model that has been
+ * explicitly set by a call to YansWifiPhy::SetMobility(), or else
+ * will return the mobility model (if any) that has been aggregated
+ * to the node.
+ *
+ * \return the mobility model this PHY is associated with
+ */
+ Ptr<MobilityModel> GetMobility (void);
+ /**
+ * Return the minimum available transmission power level (dBm).
+ * \return the minimum available transmission power level (dBm)
+ */
+ virtual double GetTxPowerStart (void) const;
+ /**
+ * Return the maximum available transmission power level (dBm).
+ * \return the maximum available transmission power level (dBm)
+ */
+ virtual double GetTxPowerEnd (void) const;
+ /**
+ * Return the number of available transmission power levels.
+ *
+ * \return the number of available transmission power levels
+ */
+ virtual uint32_t GetNTxPower (void) const;
+
+ virtual void SetReceiveOkCallback (WifiPhy::RxOkCallback callback);
+ virtual void SetReceiveErrorCallback (WifiPhy::RxErrorCallback callback);
+ virtual void SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, enum WifiPreamble preamble, uint8_t packetType, uint32_t mpduReferenceNumber);
+ virtual void RegisterListener (WifiPhyListener *listener);
+ virtual void UnregisterListener (WifiPhyListener *listener);
+ virtual void SetSleepMode (void);
+ virtual void ResumeFromSleep (void);
+ virtual bool IsStateCcaBusy (void);
+ virtual bool IsStateIdle (void);
+ virtual bool IsStateBusy (void);
+ virtual bool IsStateRx (void);
+ virtual bool IsStateTx (void);
+ virtual bool IsStateSwitching (void);
+ virtual bool IsStateSleep (void);
+ virtual Time GetStateDuration (void);
+ virtual Time GetDelayUntilIdle (void);
+ virtual Time GetLastRxStartTime (void) const;
+ virtual uint32_t GetNModes (void) const;
+ virtual WifiMode GetMode (uint32_t mode) const;
+ virtual bool IsModeSupported (WifiMode mode) const;
+ virtual bool IsMcsSupported (WifiMode mcs);
+ virtual double CalculateSnr (WifiMode txMode, double ber) const;
+ virtual Ptr<WifiChannel> GetChannel (void) const;
+
+ virtual void ConfigureStandard (enum WifiPhyStandard standard);
+
+ /**
+ * Assign a fixed random variable stream number to the random variables
+ * used by this model. Return the number of streams (possibly zero) that
+ * have been assigned.
+ *
+ * \param stream first stream index to use
+ * \return the number of stream indices assigned by this model
+ */
+ int64_t AssignStreams (int64_t stream);
+
+ /**
+ * \param freq the operating frequency on this node (2.4 GHz or 5GHz).
+ */
+ virtual void SetFrequency (uint32_t freq);
+ /**
+ * \return the operating frequency on this node
+ */
+ virtual uint32_t GetFrequency (void) const;
+ /**
+ * \param tx the number of transmitters on this node.
+ */
+ virtual void SetNumberOfTransmitAntennas (uint32_t tx);
+ /**
+ * \return the number of transmitters on this node.
+ */
+ virtual uint32_t GetNumberOfTransmitAntennas (void) const;
+ /**
+ * \param rx the number of receivers on this node.
+ */
+ virtual void SetNumberOfReceiveAntennas (uint32_t rx);
+ /**
+ * \return the number of receivers on this node.
+ */
+ virtual uint32_t GetNumberOfReceiveAntennas (void) const;
+ /**
+ * Enable or disable short/long guard interval.
+ *
+ * \param guardInterval Enable or disable guard interval
+ */
+ virtual void SetGuardInterval (bool guardInterval);
+ /**
+ * Return whether guard interval is being used.
+ *
+ * \return true if guard interval is being used, false otherwise
+ */
+ virtual bool GetGuardInterval (void) const;
+ /**
+ * Enable or disable LDPC.
+ * \param ldpc Enable or disable LDPC
+ */
+ virtual void SetLdpc (bool ldpc);
+ /**
+ * Return if LDPC is supported.
+ *
+ * \return true if LDPC is supported, false otherwise
+ */
+ virtual bool GetLdpc (void) const;
+ /**
+ * Enable or disable STBC.
+ *
+ * \param stbc Enable or disable STBC
+ */
+ virtual void SetStbc (bool stbc);
+ /**
+ * Return whether STBC is supported.
+ *
+ * \return true if STBC is supported, false otherwise
+ */
+ virtual bool GetStbc (void) const;
+ /**
+ * Enable or disable Greenfield support.
+ *
+ * \param greenfield Enable or disable Greenfield
+ */
+ virtual void SetGreenfield (bool greenfield);
+ /**
+ * Return whether Greenfield is supported.
+ *
+ * \return true if Greenfield is supported, false otherwise
+ */
+ virtual bool GetGreenfield (void) const;
+ /**
+ * Return channel width.
+ *
+ * \return channel width
+ */
+ virtual uint32_t GetChannelWidth (void) const;
+ /**
+ * Set channel width.
+ *
+ * \param channel width
+ */
+ virtual void SetChannelWidth (uint32_t channelwidth);
+
+ virtual uint32_t GetNBssMembershipSelectors (void) const;
+ virtual uint32_t GetBssMembershipSelector (uint32_t selector) const;
+ virtual WifiModeList GetMembershipSelectorModes (uint32_t selector);
+
+ /**
+ * \return the number of MCS supported by this phy
+ */
+ virtual uint8_t GetNMcs (void) const;
+ virtual WifiMode GetMcs (uint8_t mcs) const;
+
+private:
+ virtual void DoInitialize (void);
+ virtual void DoDispose (void);
+
+ /**
+ * Configure YansWifiPhy with appropriate channel frequency and
+ * supported rates for 802.11a standard.
+ */
+ void Configure80211a (void);
+ /**
+ * Configure YansWifiPhy with appropriate channel frequency and
+ * supported rates for 802.11b standard.
+ */
+ void Configure80211b (void);
+ /**
+ * Configure YansWifiPhy with appropriate channel frequency and
+ * supported rates for 802.11g standard.
+ */
+ void Configure80211g (void);
+ /**
+ * Configure YansWifiPhy with appropriate channel frequency and
+ * supported rates for 802.11a standard with 10MHz channel spacing.
+ */
+ void Configure80211_10Mhz (void);
+ /**
+ * Configure YansWifiPhy with appropriate channel frequency and
+ * supported rates for 802.11a standard with 5MHz channel spacing.
+ */
+ void Configure80211_5Mhz ();
+ void ConfigureHolland (void);
+ /**
+ * Configure YansWifiPhy with appropriate channel frequency and
+ * supported rates for 802.11n standard.
+ */
+ void Configure80211n (void);
+ /**
+ * Configure YansWifiPhy with appropriate channel frequency and
+ * supported rates for 802.11ac standard.
+ */
+ void Configure80211ac (void);
+ /**
+ * Return the energy detection threshold.
+ *
+ * \return the energy detection threshold.
+ */
+ double GetEdThresholdW (void) const;
+ /**
+ * Convert from dBm to Watts.
+ *
+ * \param dbm the power in dBm
+ *
+ * \return the equivalent Watts for the given dBm
+ */
+ double DbmToW (double dbm) const;
+ /**
+ * Convert from dB to ratio.
+ *
+ * \param db
+ *
+ * \return ratio
+ */
+ double DbToRatio (double db) const;
+ /**
+ * Convert from Watts to dBm.
+ *
+ * \param w the power in Watts
+ *
+ * \return the equivalent dBm for the given Watts
+ */
+ double WToDbm (double w) const;
+ /**
+ * Convert from ratio to dB.
+ *
+ * \param ratio
+ *
+ * \return dB
+ */
+ double RatioToDb (double ratio) const;
+ /**
+ * Get the power of the given power level in dBm.
+ * In YansWifiPhy implementation, the power levels are equally spaced (in dBm).
+ *
+ * \param power the power level
+ *
+ * \return the transmission power in dBm at the given power level
+ */
+ double GetPowerDbm (uint8_t power) const;
+ /**
+ * The last bit of the packet has arrived.
+ *
+ * \param packet the packet that the last bit has arrived
+ * \param preamble the preamble of the arriving packet
+ * \param aMpdu the type of the packet (0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU and 2 is the last MPDU in an A-MPDU)
+ * and the A-MPDU reference number (must be a different value for each A-MPDU but the same for each subframe within one A-MPDU)
+ * \param event the corresponding event of the first time the packet arrives
+ */
+ void EndReceive (Ptr<Packet> packet, enum WifiPreamble preamble, struct mpduInfo aMpdu, Ptr<InterferenceHelper::Event> event);
+
+ bool m_initialized; //!< Flag for runtime initialization
+ double m_edThresholdW; //!< Energy detection threshold in watts
+ double m_ccaMode1ThresholdW; //!< Clear channel assessment (CCA) threshold in watts
+ double m_txGainDb; //!< Transmission gain (dB)
+ double m_rxGainDb; //!< Reception gain (dB)
+ double m_txPowerBaseDbm; //!< Minimum transmission power (dBm)
+ double m_txPowerEndDbm; //!< Maximum transmission power (dBm)
+ uint32_t m_nTxPower; //!< Number of available transmission power levels
+
+ Ptr<YansWifiChannel> m_channel; //!< YansWifiChannel that this YansWifiPhy is connected to
+ uint16_t m_channelNumber; //!< Operating channel number
+ Ptr<NetDevice> m_device; //!< Pointer to the device
+ Ptr<MobilityModel> m_mobility; //!< Pointer to the mobility model
+
+ uint32_t m_numberOfTransmitters; //!< Number of transmitters
+ uint32_t m_numberOfReceivers; //!< Number of receivers
+ bool m_ldpc; //!< Flag if LDPC is used
+ bool m_stbc; //!< Flag if STBC is used
+ bool m_greenfield; //!< Flag if GreenField format is supported
+ bool m_guardInterval; //!< Flag if short guard interval is used
+ uint32_t m_channelWidth; //!< Channel width
+
+
+ /**
+ * This vector holds the set of transmission modes that this
+ * WifiPhy(-derived class) can support. In conversation we call this
+ * the DeviceRateSet (not a term you'll find in the standard), and
+ * it is a superset of standard-defined parameters such as the
+ * OperationalRateSet, and the BSSBasicRateSet (which, themselves,
+ * have a superset/subset relationship).
+ *
+ * Mandatory rates relevant to this WifiPhy can be found by
+ * iterating over this vector looking for WifiMode objects for which
+ * WifiMode::IsMandatory() is true.
+ *
+ * A quick note is appropriate here (well, here is as good a place
+ * as any I can find)...
+ *
+ * In the standard there is no text that explicitly precludes
+ * production of a device that does not support some rates that are
+ * mandatory (according to the standard) for PHYs that the device
+ * happens to fully or partially support.
+ *
+ * This approach is taken by some devices which choose to only support,
+ * for example, 6 and 9 Mbps ERP-OFDM rates for cost and power
+ * consumption reasons (i.e., these devices don't need to be designed
+ * for and waste current on the increased linearity requirement of
+ * higher-order constellations when 6 and 9 Mbps more than meet their
+ * data requirements). The wording of the standard allows such devices
+ * to have an OperationalRateSet which includes 6 and 9 Mbps ERP-OFDM
+ * rates, despite 12 and 24 Mbps being "mandatory" rates for the
+ * ERP-OFDM PHY.
+ *
+ * Now this doesn't actually have any impact on code, yet. It is,
+ * however, something that we need to keep in mind for the
+ * future. Basically, the key point is that we can't be making
+ * assumptions like "the Operational Rate Set will contain all the
+ * mandatory rates".
+ */
+ WifiModeList m_deviceRateSet;
+ WifiModeList m_deviceMcsSet;
+
+ std::vector<uint32_t> m_bssMembershipSelectorSet;
+ EventId m_endRxEvent;
+ EventId m_endPlcpRxEvent;
+
+ Ptr<UniformRandomVariable> m_random; //!< Provides uniform random variables.
+ double m_channelStartingFrequency; //!< Standard-dependent center frequency of 0-th channel in MHz
+ Ptr<WifiPhyStateHelper> m_state; //!< Pointer to WifiPhyStateHelper
+ InterferenceHelper m_interference; //!< Pointer to InterferenceHelper
+ Time m_channelSwitchDelay; //!< Time required to switch between channel
+ uint16_t m_mpdusNum; //!< carries the number of expected mpdus that are part of an A-MPDU
+ bool m_plcpSuccess; //!< Flag if the PLCP of the packet or the first MPDU in an A-MPDU has been received
+};
+
+} //namespace ns3
+
+#endif /* YANS_WIFI_PHY_H */