diff --git a/src/wifi/model/mac-rx-middle.cc b/src/wifi/model/mac-rx-middle.cc index 2a5f20129..174acaf58 100644 --- a/src/wifi/model/mac-rx-middle.cc +++ b/src/wifi/model/mac-rx-middle.cc @@ -58,11 +58,6 @@ class OriginatorRxStatus m_defragmenting = false; } - ~OriginatorRxStatus() - { - m_fragments.clear(); - } - /** * Check if we are de-fragmenting packets. * @@ -167,16 +162,6 @@ MacRxMiddle::MacRxMiddle() MacRxMiddle::~MacRxMiddle() { NS_LOG_FUNCTION_NOARGS(); - for (auto i = m_originatorStatus.begin(); i != m_originatorStatus.end(); i++) - { - delete (*i).second; - } - m_originatorStatus.erase(m_originatorStatus.begin(), m_originatorStatus.end()); - for (auto i = m_qosOriginatorStatus.begin(); i != m_qosOriginatorStatus.end(); i++) - { - delete (*i).second; - } - m_qosOriginatorStatus.erase(m_qosOriginatorStatus.begin(), m_qosOriginatorStatus.end()); } void @@ -186,63 +171,51 @@ MacRxMiddle::SetForwardCallback(ForwardUpCallback callback) m_callback = callback; } -OriginatorRxStatus* -MacRxMiddle::Lookup(const WifiMacHeader* hdr) +OriginatorRxStatus& +MacRxMiddle::Lookup(const WifiMacHeader& hdr) { NS_LOG_FUNCTION(hdr); - OriginatorRxStatus* originator; - Mac48Address source = hdr->GetAddr2(); - if (hdr->IsQosData() && !hdr->GetAddr2().IsGroup()) + const auto source = hdr.GetAddr2(); + if (hdr.IsQosData() && !source.IsGroup()) { /* only for QoS data non-broadcast frames */ - originator = m_qosOriginatorStatus[std::make_pair(source, hdr->GetQosTid())]; - if (originator == nullptr) - { - originator = new OriginatorRxStatus(); - m_qosOriginatorStatus[std::make_pair(source, hdr->GetQosTid())] = originator; - } + const auto key = std::make_pair(source, hdr.GetQosTid()); + auto [it, inserted] = m_qosOriginatorStatus.try_emplace(key); + return it->second; } - else - { - /* - management frames - * - QoS data broadcast frames - * - non-QoS data frames - * see section 7.1.3.4.1 - */ - originator = m_originatorStatus[source]; - if (originator == nullptr) - { - originator = new OriginatorRxStatus(); - m_originatorStatus[source] = originator; - } - } - return originator; + /* - management frames + * - QoS data broadcast frames + * - non-QoS data frames + * see section 7.1.3.4.1 + */ + auto [it, inserted] = m_originatorStatus.try_emplace(source); + return it->second; } bool -MacRxMiddle::IsDuplicate(const WifiMacHeader* hdr, OriginatorRxStatus* originator) const +MacRxMiddle::IsDuplicate(const WifiMacHeader& hdr, const OriginatorRxStatus& originator) const { - NS_LOG_FUNCTION(hdr << originator); - return hdr->IsRetry() && originator->GetLastSequenceControl() == hdr->GetSequenceControl(); + NS_LOG_FUNCTION(hdr << &originator); + return hdr.IsRetry() && originator.GetLastSequenceControl() == hdr.GetSequenceControl(); } Ptr MacRxMiddle::HandleFragments(Ptr packet, - const WifiMacHeader* hdr, - OriginatorRxStatus* originator) + const WifiMacHeader& hdr, + OriginatorRxStatus& originator) { - NS_LOG_FUNCTION(packet << hdr << originator); - if (originator->IsDeFragmenting()) + NS_LOG_FUNCTION(packet << hdr << &originator); + if (originator.IsDeFragmenting()) { - if (hdr->IsMoreFragments()) + if (hdr.IsMoreFragments()) { - if (originator->IsNextFragment(hdr->GetSequenceControl())) + if (originator.IsNextFragment(hdr.GetSequenceControl())) { - NS_LOG_DEBUG("accumulate fragment seq=" << hdr->GetSequenceNumber() - << ", frag=" << +hdr->GetFragmentNumber() + NS_LOG_DEBUG("accumulate fragment seq=" << hdr.GetSequenceNumber() + << ", frag=" << +hdr.GetFragmentNumber() << ", size=" << packet->GetSize()); - originator->AccumulateFragment(packet); - originator->SetSequenceControl(hdr->GetSequenceControl()); + originator.AccumulateFragment(packet); + originator.SetSequenceControl(hdr.GetSequenceControl()); } else { @@ -252,13 +225,13 @@ MacRxMiddle::HandleFragments(Ptr packet, } else { - if (originator->IsNextFragment(hdr->GetSequenceControl())) + if (originator.IsNextFragment(hdr.GetSequenceControl())) { - NS_LOG_DEBUG("accumulate last fragment seq=" - << hdr->GetSequenceNumber() << ", frag=" << +hdr->GetFragmentNumber() - << ", size=" << hdr->GetSize()); - Ptr p = originator->AccumulateLastFragment(packet); - originator->SetSequenceControl(hdr->GetSequenceControl()); + NS_LOG_DEBUG("accumulate last fragment seq=" << hdr.GetSequenceNumber() << ", frag=" + << +hdr.GetFragmentNumber() + << ", size=" << hdr.GetSize()); + Ptr p = originator.AccumulateLastFragment(packet); + originator.SetSequenceControl(hdr.GetSequenceControl()); return p; } else @@ -270,13 +243,13 @@ MacRxMiddle::HandleFragments(Ptr packet, } else { - if (hdr->IsMoreFragments()) + if (hdr.IsMoreFragments()) { - NS_LOG_DEBUG("accumulate first fragment seq=" << hdr->GetSequenceNumber() - << ", frag=" << +hdr->GetFragmentNumber() + NS_LOG_DEBUG("accumulate first fragment seq=" << hdr.GetSequenceNumber() + << ", frag=" << +hdr.GetFragmentNumber() << ", size=" << packet->GetSize()); - originator->AccumulateFirstFragment(packet); - originator->SetSequenceControl(hdr->GetSequenceControl()); + originator.AccumulateFirstFragment(packet); + originator.SetSequenceControl(hdr.GetSequenceControl()); return nullptr; } else @@ -291,10 +264,10 @@ MacRxMiddle::Receive(Ptr mpdu, uint8_t linkId) { NS_LOG_FUNCTION(*mpdu << +linkId); // consider the MAC header of the original MPDU (makes a difference for data frames only) - const WifiMacHeader* hdr = &mpdu->GetOriginal()->GetHeader(); - NS_ASSERT(hdr->IsData() || hdr->IsMgt()); + const auto& hdr = mpdu->GetOriginal()->GetHeader(); + NS_ASSERT(hdr.IsData() || hdr.IsMgt()); - OriginatorRxStatus* originator = Lookup(hdr); + auto& originator = Lookup(hdr); /** * The check below is really unneeded because it can fail in a lot of * normal cases. Specifically, it is possible for sequence numbers to @@ -304,18 +277,18 @@ MacRxMiddle::Receive(Ptr mpdu, uint8_t linkId) * So, this check cannot be used to discard old duplicate frames. It is * thus here only for documentation purposes. */ - if (!(SequenceNumber16(originator->GetLastSequenceControl()) < - SequenceNumber16(hdr->GetSequenceControl()))) + if (!(SequenceNumber16(originator.GetLastSequenceControl()) < + SequenceNumber16(hdr.GetSequenceControl()))) { NS_LOG_DEBUG("Sequence numbers have looped back. last recorded=" - << originator->GetLastSequenceControl() - << " currently seen=" << hdr->GetSequenceControl()); + << originator.GetLastSequenceControl() + << " currently seen=" << hdr.GetSequenceControl()); } // filter duplicates. if (IsDuplicate(hdr, originator)) { - NS_LOG_DEBUG("duplicate from=" << hdr->GetAddr2() << ", seq=" << hdr->GetSequenceNumber() - << ", frag=" << +hdr->GetFragmentNumber()); + NS_LOG_DEBUG("duplicate from=" << hdr.GetAddr2() << ", seq=" << hdr.GetSequenceNumber() + << ", frag=" << +hdr.GetFragmentNumber()); return; } Ptr aggregate = HandleFragments(mpdu->GetPacket(), hdr, originator); @@ -323,11 +296,11 @@ MacRxMiddle::Receive(Ptr mpdu, uint8_t linkId) { return; } - NS_LOG_DEBUG("forwarding data from=" << hdr->GetAddr2() << ", seq=" << hdr->GetSequenceNumber() - << ", frag=" << +hdr->GetFragmentNumber()); - if (!hdr->GetAddr1().IsGroup()) + NS_LOG_DEBUG("forwarding data from=" << hdr.GetAddr2() << ", seq=" << hdr.GetSequenceNumber() + << ", frag=" << +hdr.GetFragmentNumber()); + if (!hdr.GetAddr1().IsGroup()) { - originator->SetSequenceControl(hdr->GetSequenceControl()); + originator.SetSequenceControl(hdr.GetSequenceControl()); } if (aggregate == mpdu->GetPacket()) { @@ -339,7 +312,7 @@ MacRxMiddle::Receive(Ptr mpdu, uint8_t linkId) // A-MSDUs saves us the time to deaggregate the A-MSDU in MSDUs (which are // kept separate in the received mpdu) and allows us to pass the originally // transmitted packets (i.e., with the same UID) to the receiver. - m_callback(Create(aggregate, *hdr), linkId); + m_callback(Create(aggregate, hdr), linkId); } } diff --git a/src/wifi/model/mac-rx-middle.h b/src/wifi/model/mac-rx-middle.h index 389a191d3..2eb99a9a1 100644 --- a/src/wifi/model/mac-rx-middle.h +++ b/src/wifi/model/mac-rx-middle.h @@ -45,7 +45,7 @@ class MacRxMiddle : public SimpleRefCount /** * typedef for callback */ - typedef Callback, uint8_t /* link ID */> ForwardUpCallback; + using ForwardUpCallback = Callback, uint8_t /* link ID */>; MacRxMiddle(); ~MacRxMiddle(); @@ -77,7 +77,7 @@ class MacRxMiddle : public SimpleRefCount * * \return OriginatorRxStatus */ - OriginatorRxStatus* Lookup(const WifiMacHeader* hdr); + OriginatorRxStatus& Lookup(const WifiMacHeader& hdr); /** * Check if we have already received the packet from the sender before * (by looking at the sequence control field). @@ -88,7 +88,7 @@ class MacRxMiddle : public SimpleRefCount * \return true if we already received the packet previously, * false otherwise */ - bool IsDuplicate(const WifiMacHeader* hdr, OriginatorRxStatus* originator) const; + bool IsDuplicate(const WifiMacHeader& hdr, const OriginatorRxStatus& originator) const; /** * Check if the received packet is a fragment and handle it appropriately. * If the packet is not a fragment, the method returns the packet. @@ -105,27 +105,30 @@ class MacRxMiddle : public SimpleRefCount * 0 if we failed to reassemble the packet (e.g. missing fragments/out-of-order). */ Ptr HandleFragments(Ptr packet, - const WifiMacHeader* hdr, - OriginatorRxStatus* originator); + const WifiMacHeader& hdr, + OriginatorRxStatus& originator); /** * typedef for a map between address and OriginatorRxStatus */ - typedef std::map> Originators; + using Originators = std::map>; + /** * typedef for a map between address, OriginatorRxStatus, and Traffic ID */ - typedef std::map, OriginatorRxStatus*, std::less<>> - QosOriginators; + using QosOriginators = + std::map, OriginatorRxStatus, std::less<>>; + /** * typedef for an iterator for Originators */ - typedef std::map>::iterator OriginatorsI; + using OriginatorsI = std::map>::iterator; + /** * typedef for an iterator for QosOriginators */ - typedef std::map, OriginatorRxStatus*, std::less<>>::iterator - QosOriginatorsI; + using QosOriginatorsI = + std::map, OriginatorRxStatus, std::less<>>::iterator; Originators m_originatorStatus; ///< originator status QosOriginators m_qosOriginatorStatus; ///< QOS originator status