diff --git a/CHANGES.md b/CHANGES.md index 8bd670c1f..6c3ca2701 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -17,6 +17,7 @@ Changes from ns-3.41 to ns-3-dev -------------------------------- ### New API +* (wifi) New trace sources `SpectrumWifiPhy::SignalTransmission`, `YansWifiPhy::SignalArrival`, and `YansWifiPhy::SignalTransmission` * Objects now can be aggregated to multiple objects though the `Object::UnidirectionalAggregateObject` function. Objects aggregated in such a way can not use `GetObject` to access the objects they are aggregated to. * (network) Added `ApplicationHelper` helper class to create and install applications, removing diff --git a/src/wifi/model/spectrum-wifi-phy.cc b/src/wifi/model/spectrum-wifi-phy.cc index 7b3e3c224..2ca086bad 100644 --- a/src/wifi/model/spectrum-wifi-phy.cc +++ b/src/wifi/model/spectrum-wifi-phy.cc @@ -88,10 +88,11 @@ SpectrumWifiPhy::GetTypeId() DoubleValue(-40.0), MakeDoubleAccessor(&SpectrumWifiPhy::m_txMaskOuterBandMaximumRejection), MakeDoubleChecker()) - .AddTraceSource("SignalArrival", - "Signal arrival", - MakeTraceSourceAccessor(&SpectrumWifiPhy::m_signalCb), - "ns3::SpectrumWifiPhy::SignalArrivalCallback"); + .AddTraceSource( + "SignalArrival", + "Trace start of all signal arrivals, including weak and foreign signals", + MakeTraceSourceAccessor(&SpectrumWifiPhy::m_signalCb), + "ns3::SpectrumWifiPhy::SignalArrivalCallback"); return tid; } @@ -478,7 +479,7 @@ SpectrumWifiPhy::StartRx(Ptr rxParams, DynamicCast(rxParams); // Log the signal arrival to the trace source - m_signalCb(bool(wifiRxParams), senderNodeId, WToDbm(totalRxPowerW), rxDuration); + m_signalCb(rxParams, senderNodeId, WToDbm(totalRxPowerW), rxDuration); if (!wifiRxParams) { @@ -571,6 +572,7 @@ void SpectrumWifiPhy::StartTx(Ptr ppdu) { NS_LOG_FUNCTION(this << ppdu); + m_signalTransmissionCb(ppdu, ppdu->GetTxVector()); GetPhyEntity(ppdu->GetModulation())->StartTx(ppdu); } diff --git a/src/wifi/model/spectrum-wifi-phy.h b/src/wifi/model/spectrum-wifi-phy.h index f29505bb7..d4f42ee4e 100644 --- a/src/wifi/model/spectrum-wifi-phy.h +++ b/src/wifi/model/spectrum-wifi-phy.h @@ -124,12 +124,11 @@ class SpectrumWifiPhy : public WifiPhy /** * Callback invoked when the PHY model starts to process a signal * - * \param signalType Whether signal is WiFi (true) or foreign (false) * \param senderNodeId Node Id of the sender of the signal * \param rxPower received signal power (dBm) * \param duration Signal duration */ - typedef void (*SignalArrivalCallback)(bool signalType, + typedef void (*SignalArrivalCallback)(Ptr signal, uint32_t senderNodeId, double rxPower, Time duration); @@ -286,7 +285,8 @@ class SpectrumWifiPhy : public WifiPhy bool m_trackSignalsInactiveInterfaces; //!< flag whether signals coming from inactive spectrum //!< PHY interfaces are tracked - TracedCallback m_signalCb; //!< Signal callback + TracedCallback, uint32_t, double, Time> + m_signalCb; //!< Signal callback double m_txMaskInnerBandMinimumRejection; //!< The minimum rejection (in dBr) for the inner band //!< of the transmit spectrum mask diff --git a/src/wifi/model/wifi-phy.cc b/src/wifi/model/wifi-phy.cc index 87b4e4eef..d098367bf 100644 --- a/src/wifi/model/wifi-phy.cc +++ b/src/wifi/model/wifi-phy.cc @@ -350,7 +350,11 @@ WifiPhy::GetTypeId() "Trace source simulating the capability of a wifi device " "in monitor mode to sniff all frames being transmitted", MakeTraceSourceAccessor(&WifiPhy::m_phyMonitorSniffTxTrace), - "ns3::WifiPhy::MonitorSnifferTxTracedCallback"); + "ns3::WifiPhy::MonitorSnifferTxTracedCallback") + .AddTraceSource("SignalTransmission", + "Trace start of signal transmission", + MakeTraceSourceAccessor(&WifiPhy::m_signalTransmissionCb), + "ns3::SpectrumWifiPhy::SignalTransmissionCallback"); return tid; } diff --git a/src/wifi/model/wifi-phy.h b/src/wifi/model/wifi-phy.h index 8aea6a5ff..91859e591 100644 --- a/src/wifi/model/wifi-phy.h +++ b/src/wifi/model/wifi-phy.h @@ -1233,6 +1233,15 @@ class WifiPhy : public Object */ uint32_t GetSubcarrierSpacing() const; + /** + * Callback invoked when the PHY model starts to transmit a signal + * + * \param ppdu The PPDU being transmitted + * \param txVector txVector used for transmitting the PPDU + */ + typedef void (*SignalTransmissionCallback)(Ptr ppdu, + const WifiTxVector& txVector); + protected: void DoInitialize() override; void DoDispose() override; @@ -1325,6 +1334,9 @@ class WifiPhy : public Object */ std::map> m_phyEntities; + TracedCallback, const WifiTxVector&> + m_signalTransmissionCb; //!< Signal Transmission callback + private: /** * Configure WifiPhy with appropriate channel frequency and diff --git a/src/wifi/model/yans-wifi-channel.cc b/src/wifi/model/yans-wifi-channel.cc index afc67e099..e3e1b055b 100644 --- a/src/wifi/model/yans-wifi-channel.cc +++ b/src/wifi/model/yans-wifi-channel.cc @@ -135,6 +135,7 @@ YansWifiChannel::Receive(Ptr phy, Ptr ppdu, double { NS_LOG_FUNCTION(phy << ppdu << rxPowerDbm); const auto totalRxPowerDbm = rxPowerDbm + phy->GetRxGain(); + phy->TraceSignalArrival(ppdu, totalRxPowerDbm, ppdu->GetTxDuration()); // Do no further processing if signal is too weak // Current implementation assumes constant RX power over the PPDU duration // Compare received TX power per MHz to normalized RX sensitivity diff --git a/src/wifi/model/yans-wifi-phy.cc b/src/wifi/model/yans-wifi-phy.cc index b0f0b74e3..b943506e7 100644 --- a/src/wifi/model/yans-wifi-phy.cc +++ b/src/wifi/model/yans-wifi-phy.cc @@ -36,10 +36,15 @@ NS_OBJECT_ENSURE_REGISTERED(YansWifiPhy); TypeId YansWifiPhy::GetTypeId() { - static TypeId tid = TypeId("ns3::YansWifiPhy") - .SetParent() - .SetGroupName("Wifi") - .AddConstructor(); + static TypeId tid = + TypeId("ns3::YansWifiPhy") + .SetParent() + .SetGroupName("Wifi") + .AddConstructor() + .AddTraceSource("SignalArrival", + "Trace start of all signal arrivals, including weak signals", + MakeTraceSourceAccessor(&YansWifiPhy::m_signalArrivalCb), + "ns3::YansWifiPhy::SignalArrivalCallback"); return tid; } @@ -89,9 +94,17 @@ YansWifiPhy::StartTx(Ptr ppdu) NS_LOG_FUNCTION(this << ppdu); NS_LOG_DEBUG("Start transmission: signal power before antenna gain=" << GetPowerDbm(ppdu->GetTxVector().GetTxPowerLevel()) << "dBm"); + m_signalTransmissionCb(ppdu, ppdu->GetTxVector()); m_channel->Send(this, ppdu, GetTxPowerForTransmission(ppdu) + GetTxGain()); } +void +YansWifiPhy::TraceSignalArrival(Ptr ppdu, double rxPowerDbm, Time duration) +{ + NS_LOG_FUNCTION(this << ppdu); + m_signalArrivalCb(ppdu, rxPowerDbm, ppdu->GetTxDuration()); +} + uint16_t YansWifiPhy::GetGuardBandwidth(uint16_t currentChannelWidth) const { diff --git a/src/wifi/model/yans-wifi-phy.h b/src/wifi/model/yans-wifi-phy.h index 7bbac571f..1724d6345 100644 --- a/src/wifi/model/yans-wifi-phy.h +++ b/src/wifi/model/yans-wifi-phy.h @@ -73,11 +73,35 @@ class YansWifiPhy : public WifiPhy */ void SetChannel(const Ptr channel); + /** + * Logs the arrival of a PPDU, including its power and duration. + * This will also trace PPDUs below WifiPhy::RxSensitivity + * + * \param [in] ppdu The PPDU being traced upon its arrival. + * \param [in] rxPowerDbm The received power of the PPDU in dBm. + * \param [in] duration The duration of the PPDU signal. + */ + void TraceSignalArrival(Ptr ppdu, double rxPowerDbm, Time duration); + + /** + * Callback invoked when the PHY model starts to process a signal + * + * \param ppdu The PPDU being processed + * \param rxPowerDbm received signal power (dBm) + * \param duration Signal duration + */ + typedef void (*SignalArrivalCallback)(Ptr ppdu, + double rxPowerDbm, + Time duration); + protected: void DoDispose() override; private: Ptr m_channel; //!< YansWifiChannel that this YansWifiPhy is connected to + + TracedCallback, double, Time> + m_signalArrivalCb; //!< Signal Arrival callback }; } // namespace ns3