/usr/include/ns3.26/ns3/interference-helper.h is in libns3-dev 3.26+dfsg-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 | /* -*- 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
*
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
*/
#ifndef INTERFERENCE_HELPER_H
#define INTERFERENCE_HELPER_H
#include <stdint.h>
#include <vector>
#include <list>
#include "wifi-mode.h"
#include "wifi-preamble.h"
#include "wifi-phy-standard.h"
#include "ns3/nstime.h"
#include "ns3/simple-ref-count.h"
#include "ns3/wifi-tx-vector.h"
#include "error-rate-model.h"
namespace ns3 {
/**
* \ingroup wifi
* \brief handles interference calculations
*/
class InterferenceHelper
{
public:
/**
* Signal event for a packet.
*/
class Event : public SimpleRefCount<InterferenceHelper::Event>
{
public:
/**
* Create an Event with the given parameters.
*
* \param size packet size
* \param txVector TXVECTOR of the packet
* \param preamble preamble type
* \param duration duration of the signal
* \param rxPower the receive power (w)
*/
Event (uint32_t size, WifiTxVector txVector,
enum WifiPreamble preamble,
Time duration, double rxPower);
~Event ();
/**
* Return the duration of the signal.
*
* \return the duration of the signal
*/
Time GetDuration (void) const;
/**
* Return the start time of the signal.
*
* \return the start time of the signal
*/
Time GetStartTime (void) const;
/**
* Return the end time of the signal.
*
* \return the end time of the signal
*/
Time GetEndTime (void) const;
/**
* Return the receive power (w).
*
* \return the receive power (w)
*/
double GetRxPowerW (void) const;
/**
* Return the size of the packet (bytes).
*
* \return the size of the packet (bytes)
*/
uint32_t GetSize (void) const;
/**
* Return the TXVECTOR of the packet.
*
* \return the TXVECTOR of the packet
*/
WifiTxVector GetTxVector (void) const;
/**
* Return the Wi-Fi mode used for the payload.
*
* \return the Wi-Fi mode used for the payload
*/
WifiMode GetPayloadMode (void) const;
/**
* Return the preamble type of the packet.
*
* \return the preamble type of the packet
*/
enum WifiPreamble GetPreambleType (void) const;
private:
uint32_t m_size;
WifiTxVector m_txVector;
enum WifiPreamble m_preamble;
Time m_startTime;
Time m_endTime;
double m_rxPowerW;
};
/**
* A struct for both SNR and PER
*/
struct SnrPer
{
double snr;
double per;
};
InterferenceHelper ();
~InterferenceHelper ();
/**
* Set the noise figure.
*
* \param value noise figure
*/
void SetNoiseFigure (double value);
/**
* Set the error rate model for this interference helper.
*
* \param rate Error rate model
*/
void SetErrorRateModel (Ptr<ErrorRateModel> rate);
/**
* Return the noise figure.
*
* \return the noise figure
*/
double GetNoiseFigure (void) const;
/**
* Return the error rate model.
*
* \return Error rate model
*/
Ptr<ErrorRateModel> GetErrorRateModel (void) const;
/**
* \param energyW the minimum energy (W) requested
*
* \returns the expected amount of time the observed
* energy on the medium will be higher than
* the requested threshold.
*/
Time GetEnergyDuration (double energyW);
/**
* Add the packet-related signal to interference helper.
*
* \param size packet size
* \param txVector TXVECTOR of the packet
* \param preamble Wi-Fi preamble for the packet
* \param duration the duration of the signal
* \param rxPower receive power (W)
*
* \return InterferenceHelper::Event
*/
Ptr<InterferenceHelper::Event> Add (uint32_t size, WifiTxVector txVector,
enum WifiPreamble preamble,
Time duration, double rxPower);
/**
* Add a non-Wifi signal to interference helper.
* \param duration the duration of the signal
* \param rxPower receive power (W)
*/
void AddForeignSignal (Time duration, double rxPower);
/**
* Calculate the SNIR at the start of the plcp payload and accumulate
* all SNIR changes in the snir vector.
*
* \param event the event corresponding to the first time the corresponding packet arrives
*
* \return struct of SNR and PER
*/
struct InterferenceHelper::SnrPer CalculatePlcpPayloadSnrPer (Ptr<InterferenceHelper::Event> event);
/**
* Calculate the SNIR at the start of the plcp header and accumulate
* all SNIR changes in the snir vector.
*
* \param event the event corresponding to the first time the corresponding packet arrives
*
* \return struct of SNR and PER
*/
struct InterferenceHelper::SnrPer CalculatePlcpHeaderSnrPer (Ptr<InterferenceHelper::Event> event);
/**
* Notify that RX has started.
*/
void NotifyRxStart ();
/**
* Notify that RX has ended.
*/
void NotifyRxEnd ();
/**
* Erase all events.
*/
void EraseEvents (void);
private:
/**
* Noise and Interference (thus Ni) event.
*/
class NiChange
{
public:
/**
* Create a NiChange at the given time and the amount of NI change.
*
* \param time time of the event
* \param delta the power
*/
NiChange (Time time, double delta);
/**
* Return the event time.
*
* \return the event time.
*/
Time GetTime (void) const;
/**
* Return the power
*
* \return the power
*/
double GetDelta (void) const;
/**
* Compare the event time of two NiChange objects (a < o).
*
* \param o
* \return true if a < o.time, false otherwise
*/
bool operator < (const NiChange& o) const;
private:
Time m_time;
double m_delta;
};
/**
* typedef for a vector of NiChanges
*/
typedef std::vector <NiChange> NiChanges;
/**
* typedef for a list of Events
*/
typedef std::list<Ptr<Event> > Events;
/**
* Append the given Event.
*
* \param event
*/
void AppendEvent (Ptr<Event> event);
/**
* Calculate noise and interference power in W.
*
* \param event
* \param ni
*
* \return noise and interference power
*/
double CalculateNoiseInterferenceW (Ptr<Event> event, NiChanges *ni) const;
/**
* Calculate SNR (linear ratio) from the given signal power and noise+interference power.
* (Mode is not currently used)
*
* \param signal
* \param noiseInterference
* \param channelWidth
*
* \return SNR in liear ratio
*/
double CalculateSnr (double signal, double noiseInterference, uint32_t channelWidth) const;
/**
* Calculate the success rate of the chunk given the SINR, duration, and Wi-Fi mode.
* The duration and mode are used to calculate how many bits are present in the chunk.
*
* \param snir SINR
* \param duration
* \param mode
* \param txVector
*
* \return the success rate
*/
double CalculateChunkSuccessRate (double snir, Time duration, WifiMode mode, WifiTxVector txVector) const;
/**
* Calculate the error rate of the given plcp payload. The plcp payload can be divided into
* multiple chunks (e.g. due to interference from other transmissions).
*
* \param event
* \param ni
*
* \return the error rate of the packet
*/
double CalculatePlcpPayloadPer (Ptr<const Event> event, NiChanges *ni) const;
/**
* Calculate the error rate of the plcp header. The plcp header can be divided into
* multiple chunks (e.g. due to interference from other transmissions).
*
* \param event
* \param ni
*
* \return the error rate of the packet
*/
double CalculatePlcpHeaderPer (Ptr<const Event> event, NiChanges *ni) const;
double m_noiseFigure; /**< noise figure (linear) */
Ptr<ErrorRateModel> m_errorRateModel;
/// Experimental: needed for energy duration calculation
NiChanges m_niChanges;
double m_firstPower;
bool m_rxing;
/// Returns an iterator to the first nichange, which is later than moment
NiChanges::iterator GetPosition (Time moment);
/**
* Add NiChange to the list at the appropriate position.
*
* \param change
*/
void AddNiChangeEvent (NiChange change);
};
} //namespace ns3
#endif /* INTERFERENCE_HELPER_H */
|