wifi: Cleanup use of pointers in MacRxMiddle
This commit is contained in:
@@ -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<const Packet>
|
||||
MacRxMiddle::HandleFragments(Ptr<const Packet> 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<const Packet> 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<Packet> p = originator->AccumulateLastFragment(packet);
|
||||
originator->SetSequenceControl(hdr->GetSequenceControl());
|
||||
NS_LOG_DEBUG("accumulate last fragment seq=" << hdr.GetSequenceNumber() << ", frag="
|
||||
<< +hdr.GetFragmentNumber()
|
||||
<< ", size=" << hdr.GetSize());
|
||||
Ptr<Packet> p = originator.AccumulateLastFragment(packet);
|
||||
originator.SetSequenceControl(hdr.GetSequenceControl());
|
||||
return p;
|
||||
}
|
||||
else
|
||||
@@ -270,13 +243,13 @@ MacRxMiddle::HandleFragments(Ptr<const Packet> 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<const WifiMpdu> 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<const WifiMpdu> 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<const Packet> aggregate = HandleFragments(mpdu->GetPacket(), hdr, originator);
|
||||
@@ -323,11 +296,11 @@ MacRxMiddle::Receive(Ptr<const WifiMpdu> 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<const WifiMpdu> 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<WifiMpdu>(aggregate, *hdr), linkId);
|
||||
m_callback(Create<WifiMpdu>(aggregate, hdr), linkId);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ class MacRxMiddle : public SimpleRefCount<MacRxMiddle>
|
||||
/**
|
||||
* typedef for callback
|
||||
*/
|
||||
typedef Callback<void, Ptr<const WifiMpdu>, uint8_t /* link ID */> ForwardUpCallback;
|
||||
using ForwardUpCallback = Callback<void, Ptr<const WifiMpdu>, uint8_t /* link ID */>;
|
||||
|
||||
MacRxMiddle();
|
||||
~MacRxMiddle();
|
||||
@@ -77,7 +77,7 @@ class MacRxMiddle : public SimpleRefCount<MacRxMiddle>
|
||||
*
|
||||
* \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<MacRxMiddle>
|
||||
* \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<MacRxMiddle>
|
||||
* 0 if we failed to reassemble the packet (e.g. missing fragments/out-of-order).
|
||||
*/
|
||||
Ptr<const Packet> HandleFragments(Ptr<const Packet> packet,
|
||||
const WifiMacHeader* hdr,
|
||||
OriginatorRxStatus* originator);
|
||||
const WifiMacHeader& hdr,
|
||||
OriginatorRxStatus& originator);
|
||||
|
||||
/**
|
||||
* typedef for a map between address and OriginatorRxStatus
|
||||
*/
|
||||
typedef std::map<Mac48Address, OriginatorRxStatus*, std::less<>> Originators;
|
||||
using Originators = std::map<Mac48Address, OriginatorRxStatus, std::less<>>;
|
||||
|
||||
/**
|
||||
* typedef for a map between address, OriginatorRxStatus, and Traffic ID
|
||||
*/
|
||||
typedef std::map<std::pair<Mac48Address, uint8_t>, OriginatorRxStatus*, std::less<>>
|
||||
QosOriginators;
|
||||
using QosOriginators =
|
||||
std::map<std::pair<Mac48Address, uint8_t>, OriginatorRxStatus, std::less<>>;
|
||||
|
||||
/**
|
||||
* typedef for an iterator for Originators
|
||||
*/
|
||||
typedef std::map<Mac48Address, OriginatorRxStatus*, std::less<>>::iterator OriginatorsI;
|
||||
using OriginatorsI = std::map<Mac48Address, OriginatorRxStatus, std::less<>>::iterator;
|
||||
|
||||
/**
|
||||
* typedef for an iterator for QosOriginators
|
||||
*/
|
||||
typedef std::map<std::pair<Mac48Address, uint8_t>, OriginatorRxStatus*, std::less<>>::iterator
|
||||
QosOriginatorsI;
|
||||
using QosOriginatorsI =
|
||||
std::map<std::pair<Mac48Address, uint8_t>, OriginatorRxStatus, std::less<>>::iterator;
|
||||
|
||||
Originators m_originatorStatus; ///< originator status
|
||||
QosOriginators m_qosOriginatorStatus; ///< QOS originator status
|
||||
|
||||
Reference in New Issue
Block a user