--- a/src/devices/wifi/mac-low.cc Thu Nov 22 10:44:48 2007 +0100
+++ b/src/devices/wifi/mac-low.cc Thu Nov 22 14:27:22 2007 +0100
@@ -230,7 +230,7 @@
m_sendAckEvent (),
m_sendDataEvent (),
m_waitSifsEvent (),
- m_hasCurrent (false)
+ m_currentPacket (0)
{
m_lastNavDuration = Seconds (0);
m_lastNavStart = Seconds (0);
@@ -339,7 +339,7 @@
void
-MacLow::StartTransmission (Packet packet,
+MacLow::StartTransmission (Ptr<const Packet> packet,
WifiMacHeader const*hdr,
MacLowTransmissionParameters parameters,
MacLowTransmissionListener *listener)
@@ -358,13 +358,8 @@
* QapScheduler has taken access to the channel from
* one of the Edca of the QAP.
*/
- if (m_hasCurrent)
- {
- m_hasCurrent = false;
- }
- m_currentPacket = packet;
+ m_currentPacket = packet->Copy ();
m_currentHdr = *hdr;
- m_hasCurrent = true;
CancelAllEvents ();
m_listener = listener;
m_txParams = parameters;
@@ -387,7 +382,7 @@
}
void
-MacLow::ReceiveError (Packet packet, double rxSnr)
+MacLow::ReceiveError (Ptr<Packet> packet, double rxSnr)
{
MY_DEBUG ("rx failed ");
m_dropError (packet);
@@ -401,7 +396,7 @@
}
void
-MacLow::ReceiveOk (Packet packet, double rxSnr, WifiMode txMode, WifiPreamble preamble)
+MacLow::ReceiveOk (Ptr<Packet> packet, double rxSnr, WifiMode txMode, WifiPreamble preamble)
{
/* A packet is received from the PHY.
* When we have handled this packet,
@@ -409,7 +404,7 @@
* packet queue.
*/
WifiMacHeader hdr;
- packet.RemoveHeader (hdr);
+ packet->RemoveHeader (hdr);
bool isPrevNavZero = IsNavZero ();
MY_DEBUG ("duration/id=" << hdr.GetDuration ());
@@ -444,11 +439,11 @@
else if (hdr.IsCts () &&
hdr.GetAddr1 () == m_device->GetSelfAddress () &&
m_ctsTimeoutEvent.IsRunning () &&
- m_hasCurrent)
+ m_currentPacket != 0)
{
MY_DEBUG ("receive cts from="<<m_currentHdr.GetAddr1 ());
SnrTag tag;
- packet.PeekTag (tag);
+ packet->PeekTag (tag);
MacStation *station = GetStation (m_currentHdr.GetAddr1 ());
station->ReportRxOk (rxSnr, txMode);
station->ReportRtsOk (rxSnr, txMode, tag.Get ());
@@ -471,7 +466,7 @@
{
MY_DEBUG ("receive ack from="<<m_currentHdr.GetAddr1 ());
SnrTag tag;
- packet.PeekTag (tag);
+ packet->PeekTag (tag);
MacStation *station = GetStation (m_currentHdr.GetAddr1 ());
station->ReportRxOk (rxSnr, txMode);
station->ReportDataOk (rxSnr, txMode, tag.Get ());
@@ -543,7 +538,7 @@
return;
rxPacket:
WifiMacTrailer fcs;
- packet.RemoveTrailer (fcs);
+ packet->RemoveTrailer (fcs);
m_rxCallback (packet, &hdr);
return;
}
@@ -605,7 +600,7 @@
MacLow::GetCurrentSize (void) const
{
WifiMacTrailer fcs;
- return m_currentPacket.GetSize () + m_currentHdr.GetSize () + fcs.GetSerializedSize ();
+ return m_currentPacket->GetSize () + m_currentHdr.GetSize () + fcs.GetSerializedSize ();
}
WifiMode
@@ -746,12 +741,12 @@
}
void
-MacLow::ForwardDown (Packet const packet, WifiMacHeader const* hdr,
+MacLow::ForwardDown (Ptr<const Packet> packet, WifiMacHeader const* hdr,
WifiMode txMode)
{
MY_DEBUG ("send " << hdr->GetTypeString () <<
", to=" << hdr->GetAddr1 () <<
- ", size=" << packet.GetSize () <<
+ ", size=" << packet->GetSize () <<
", mode=" << txMode <<
", duration=" << hdr->GetDuration () <<
", seq=0x"<< std::hex << m_currentHdr.GetSequenceControl () << std::dec);
@@ -761,7 +756,7 @@
* requirement from section 9.9.1.4 that each EDCAF update its NAV from the
* transmission of any other EDCAF within the same QSTA.
*/
- Time txDuration = m_phy->CalculateTxDuration (packet.GetSize (), txMode, WIFI_PREAMBLE_LONG);
+ Time txDuration = m_phy->CalculateTxDuration (packet->GetSize (), txMode, WIFI_PREAMBLE_LONG);
Simulator::Schedule (txDuration, &MacLow::NotifyNav, this, *hdr, txMode, WIFI_PREAMBLE_LONG);
}
@@ -774,7 +769,7 @@
// end of rx if there was a rx start before now.
MacStation *station = GetStation (m_currentHdr.GetAddr1 ());
station->ReportRtsFailed ();
- m_hasCurrent = false;
+ m_currentPacket = 0;
MacLowTransmissionListener *listener = m_listener;
m_listener = 0;
listener->MissedCts ();
@@ -862,10 +857,10 @@
NS_ASSERT (m_ctsTimeoutEvent.IsExpired ());
m_ctsTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::CtsTimeout, this);
- Packet packet;
- packet.AddHeader (rts);
+ Ptr<Packet> packet = Create<Packet> ();
+ packet->AddHeader (rts);
WifiMacTrailer fcs;
- packet.AddTrailer (fcs);
+ packet->AddTrailer (fcs);
ForwardDown (packet, &rts, rtsTxMode);
}
@@ -940,12 +935,12 @@
}
m_currentHdr.SetDuration (duration);
- m_currentPacket.AddHeader (m_currentHdr);
+ m_currentPacket->AddHeader (m_currentHdr);
WifiMacTrailer fcs;
- m_currentPacket.AddTrailer (fcs);
+ m_currentPacket->AddTrailer (fcs);
ForwardDown (m_currentPacket, &m_currentHdr, dataTxMode);
- m_hasCurrent = false;
+ m_currentPacket = 0;
}
bool
@@ -984,14 +979,14 @@
NS_ASSERT (duration >= MicroSeconds (0));
cts.SetDuration (duration);
- Packet packet;
- packet.AddHeader (cts);
+ Ptr<Packet> packet = Create<Packet> ();
+ packet->AddHeader (cts);
WifiMacTrailer fcs;
- packet.AddTrailer (fcs);
+ packet->AddTrailer (fcs);
struct SnrTag tag;
tag.Set (rtsSnr);
- packet.AddTag (tag);
+ packet->AddTag (tag);
ForwardDown (packet, &cts, ctsTxMode);
}
@@ -1002,7 +997,7 @@
/* send the third step in a
* RTS/CTS/DATA/ACK hanshake
*/
- NS_ASSERT (m_hasCurrent);
+ NS_ASSERT (m_currentPacket != 0);
WifiMode dataTxMode = GetDataTxMode (m_currentHdr.GetAddr1 (), GetCurrentSize ());
StartDataTxTimers ();
@@ -1012,12 +1007,12 @@
NS_ASSERT (duration >= MicroSeconds (0));
m_currentHdr.SetDuration (duration);
- m_currentPacket.AddHeader (m_currentHdr);
+ m_currentPacket->AddHeader (m_currentHdr);
WifiMacTrailer fcs;
- m_currentPacket.AddTrailer (fcs);
+ m_currentPacket->AddTrailer (fcs);
ForwardDown (m_currentPacket, &m_currentHdr, dataTxMode);
- m_hasCurrent = false;
+ m_currentPacket = 0;
}
void
@@ -1052,14 +1047,14 @@
NS_ASSERT (duration >= MicroSeconds (0));
ack.SetDuration (duration);
- Packet packet;
- packet.AddHeader (ack);
+ Ptr<Packet> packet = Create<Packet> ();
+ packet->AddHeader (ack);
WifiMacTrailer fcs;
- packet.AddTrailer (fcs);
+ packet->AddTrailer (fcs);
struct SnrTag tag;
tag.Set (dataSnr);
- packet.AddTag (tag);
+ packet->AddTag (tag);
ForwardDown (packet, &ack, ackTxMode);
}