port to Ptr<Packet> branch
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Thu, 22 Nov 2007 14:27:22 +0100
changeset 2159 20f882e85b4a
parent 2158 1bae76be026d
child 2160 011b36a7776d
port to Ptr<Packet> branch
samples/main-adhoc-wifi.cc
samples/main-ap-wifi.cc
src/devices/wifi/dca-txop.cc
src/devices/wifi/dca-txop.h
src/devices/wifi/mac-high-adhoc.cc
src/devices/wifi/mac-high-adhoc.h
src/devices/wifi/mac-high-nqap.cc
src/devices/wifi/mac-high-nqap.h
src/devices/wifi/mac-high-nqsta.cc
src/devices/wifi/mac-high-nqsta.h
src/devices/wifi/mac-low.cc
src/devices/wifi/mac-low.h
src/devices/wifi/mac-rx-middle.cc
src/devices/wifi/mac-rx-middle.h
src/devices/wifi/wifi-channel.cc
src/devices/wifi/wifi-channel.h
src/devices/wifi/wifi-mac-queue.cc
src/devices/wifi/wifi-mac-queue.h
src/devices/wifi/wifi-net-device.cc
src/devices/wifi/wifi-net-device.h
src/devices/wifi/wifi-phy.cc
src/devices/wifi/wifi-phy.h
--- a/samples/main-adhoc-wifi.cc	Thu Nov 22 10:44:48 2007 +0100
+++ b/samples/main-adhoc-wifi.cc	Thu Nov 22 14:27:22 2007 +0100
@@ -87,9 +87,9 @@
 }
 
 static void
-ReceivePacket (Ptr<Socket> socket, const Packet &packet, const Address &address)
+ReceivePacket (Ptr<Socket> socket, Ptr<Packet> packet, const Address &address)
 {
-  g_bytesTotal += packet.GetSize ();
+  g_bytesTotal += packet->GetSize ();
 }
 
 static Ptr<Socket>
--- a/samples/main-ap-wifi.cc	Thu Nov 22 10:44:48 2007 +0100
+++ b/samples/main-ap-wifi.cc	Thu Nov 22 14:27:22 2007 +0100
@@ -39,7 +39,7 @@
 using namespace ns3;
 
 void
-WifiNetDeviceTrace (const TraceContext &context, Packet p, Mac48Address address)
+WifiNetDeviceTrace (const TraceContext &context, Ptr<const Packet> p, Mac48Address address)
 {
   std::cout << context << " ad=" << address << " p: " << p << std::endl;
 }
--- a/src/devices/wifi/dca-txop.cc	Thu Nov 22 10:44:48 2007 +0100
+++ b/src/devices/wifi/dca-txop.cc	Thu Nov 22 14:27:22 2007 +0100
@@ -96,7 +96,7 @@
 
 DcaTxop::DcaTxop (uint32_t minCw, uint32_t maxCw, uint32_t aifsn, DcfManager *manager)
   : m_manager (manager),
-    m_hasCurrent (false),
+    m_currentPacket (0),
     m_ssrc (0),
     m_slrc (0)
 
@@ -158,7 +158,7 @@
 }
 
 void 
-DcaTxop::Queue (Packet packet, WifiMacHeader const &hdr)
+DcaTxop::Queue (Ptr<const Packet> packet, WifiMacHeader const &hdr)
 {
   m_queue->Enqueue (packet, hdr);
   StartAccessIfNeeded ();
@@ -167,7 +167,7 @@
 void
 DcaTxop::RestartAccessIfNeeded (void)
 {
-  if ((m_hasCurrent ||
+  if ((m_currentPacket != 0 ||
        !m_queue->IsEmpty ()) &&
       !m_dcf->IsAccessRequested ())
     {
@@ -178,7 +178,7 @@
 void
 DcaTxop::StartAccessIfNeeded (void)
 {
-  if (!m_hasCurrent &&
+  if (m_currentPacket == 0 &&
       !m_queue->IsEmpty () &&
       !m_dcf->IsAccessRequested ())
     {
@@ -203,7 +203,7 @@
 bool
 DcaTxop::NeedRts (void)
 {
-  if (m_currentPacket.GetSize () > Parameters ()->GetRtsCtsThreshold ()) 
+  if (m_currentPacket->GetSize () > Parameters ()->GetRtsCtsThreshold ()) 
     {
       return true;
     } 
@@ -216,7 +216,7 @@
 bool
 DcaTxop::NeedFragmentation (void)
 {
-  if (m_currentPacket.GetSize () > Parameters ()->GetFragmentationThreshold ()) 
+  if (m_currentPacket->GetSize () > Parameters ()->GetFragmentationThreshold ()) 
     {
       return true;
     } 
@@ -229,7 +229,7 @@
 uint32_t
 DcaTxop::GetNFragments (void)
 {
-  uint32_t nFragments = m_currentPacket.GetSize () / Parameters ()->GetFragmentationThreshold () + 1;
+  uint32_t nFragments = m_currentPacket->GetSize () / Parameters ()->GetFragmentationThreshold () + 1;
   return nFragments;
 }
 void
@@ -241,7 +241,7 @@
 uint32_t
 DcaTxop::GetLastFragmentSize (void)
 {
-  uint32_t lastFragmentSize = m_currentPacket.GetSize () %
+  uint32_t lastFragmentSize = m_currentPacket->GetSize () %
     Parameters ()->GetFragmentationThreshold ();
   return lastFragmentSize;
 }
@@ -283,23 +283,23 @@
     }
 }
 
-Packet 
+Ptr<Packet>
 DcaTxop::GetFragmentPacket (WifiMacHeader *hdr)
 {
   *hdr = m_currentHdr;
   hdr->SetFragmentNumber (m_fragmentNumber);
   uint32_t startOffset = m_fragmentNumber * GetFragmentSize ();
-  Packet fragment;
+  Ptr<Packet> fragment;
   if (IsLastFragment ()) 
     {
       hdr->SetNoMoreFragments ();
-      fragment = m_currentPacket.CreateFragment (startOffset, 
+      fragment = m_currentPacket->CreateFragment (startOffset, 
                                                  GetLastFragmentSize ());
     } 
   else 
     {
       hdr->SetMoreFragments ();
-      fragment = m_currentPacket.CreateFragment (startOffset, 
+      fragment = m_currentPacket->CreateFragment (startOffset, 
                                                  GetFragmentSize ());
     }
   return fragment;
@@ -308,23 +308,20 @@
 bool 
 DcaTxop::NeedsAccess (void) const
 {
-  return !m_queue->IsEmpty () || m_hasCurrent;
+  return !m_queue->IsEmpty () || m_currentPacket != 0;
 }
 void 
 DcaTxop::NotifyAccessGranted (void)
 {
-  if (!m_hasCurrent) 
+  if (m_currentPacket == 0) 
     {
       if (m_queue->IsEmpty ()) 
         {
           MY_DEBUG ("queue empty");
           return;
         }
-      bool found;
-      m_currentPacket = m_queue->Dequeue (&m_currentHdr, &found);
-      NS_ASSERT (found);
-      m_hasCurrent = true;
-      NS_ASSERT (m_hasCurrent);
+      m_currentPacket = m_queue->Dequeue (&m_currentHdr);
+      NS_ASSERT (m_currentPacket != 0);
       uint16_t sequence = m_txMiddle->GetNextSequenceNumberfor (&m_currentHdr);
       m_currentHdr.SetSequenceNumber (sequence);
       m_currentHdr.SetFragmentNumber (0);
@@ -332,7 +329,7 @@
       m_ssrc = 0;
       m_slrc = 0;
       m_fragmentNumber = 0;
-      MY_DEBUG ("dequeued size="<<m_currentPacket.GetSize ()<<
+      MY_DEBUG ("dequeued size="<<m_currentPacket->GetSize ()<<
                     ", to="<<m_currentHdr.GetAddr1 ()<<
                     ", seq="<<m_currentHdr.GetSequenceControl ()); 
     }
@@ -347,7 +344,7 @@
                                  &m_currentHdr,
                                  params,
                                  m_transmissionListener);
-      m_hasCurrent = false;
+      m_currentPacket = 0;
       m_dcf->ResetCw ();
       m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
       MY_DEBUG ("tx broadcast");
@@ -360,15 +357,15 @@
         {
           params.DisableRts ();
           WifiMacHeader hdr;
-          Packet fragment = GetFragmentPacket (&hdr);
+          Ptr<Packet> fragment = GetFragmentPacket (&hdr);
           if (IsLastFragment ()) 
             {
-              MY_DEBUG ("fragmenting last fragment size="<<fragment.GetSize ());
+              MY_DEBUG ("fragmenting last fragment size="<<fragment->GetSize ());
               params.DisableNextData ();
             } 
           else 
             {
-              MY_DEBUG ("fragmenting size="<<fragment.GetSize ());
+              MY_DEBUG ("fragmenting size="<<fragment->GetSize ());
               params.EnableNextData (GetNextFragmentSize ());
             }
           Low ()->StartTransmission (fragment, &hdr, params, 
@@ -387,14 +384,7 @@
               MY_DEBUG ("tx unicast");
             }
           params.DisableNextData ();
-          // We need to make a copy in case we need to 
-          // retransmit the packet: the MacLow modifies the input
-          // Packet so, we would retransmit a modified packet
-          // if we were not to make a copy.
-          // XXX the comment above and the code below do not
-          // make sense anymore. So, we should remove both.
-          Packet copy = m_currentPacket;
-          Low ()->StartTransmission (copy, &m_currentHdr,
+          Low ()->StartTransmission (m_currentPacket, &m_currentHdr,
                                      params, m_transmissionListener);
         }
     }
@@ -428,7 +418,7 @@
   if (m_ssrc > Parameters ()->GetMaxSsrc ()) 
     {
       // to reset the dcf.
-      m_hasCurrent = false;
+      m_currentPacket = 0;
       m_dcf->ResetCw ();
     } 
   else 
@@ -454,14 +444,14 @@
       /* we are not fragmenting or we are done fragmenting
        * so we can get rid of that packet now.
        */
-      m_hasCurrent = false;
+      m_currentPacket = 0;
       m_dcf->ResetCw ();
       m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
       RestartAccessIfNeeded ();
     } 
   else 
     {
-      MY_DEBUG ("got ack. tx not done, size="<<m_currentPacket.GetSize ());
+      MY_DEBUG ("got ack. tx not done, size="<<m_currentPacket->GetSize ());
     }
 }
 void 
@@ -473,7 +463,7 @@
   if (m_slrc > Parameters ()->GetMaxSlrc ()) 
     {
       // to reset the dcf.    
-      m_hasCurrent = false;
+      m_currentPacket = 0;
       m_dcf->ResetCw ();
     } 
   else 
@@ -495,7 +485,7 @@
   /* this callback is used only for fragments. */
   NextFragment ();
   WifiMacHeader hdr;
-  Packet fragment = GetFragmentPacket (&hdr);
+  Ptr<Packet> fragment = GetFragmentPacket (&hdr);
   MacLowTransmissionParameters params;
   params.EnableAck ();
   params.DisableRts ();
--- a/src/devices/wifi/dca-txop.h	Thu Nov 22 10:44:48 2007 +0100
+++ b/src/devices/wifi/dca-txop.h	Thu Nov 22 14:27:22 2007 +0100
@@ -102,7 +102,7 @@
    * Store the packet in the internal queue until it
    * can be sent safely.
    */
-  void Queue (Packet packet, WifiMacHeader const &hdr);
+  void Queue (Ptr<const Packet> packet, WifiMacHeader const &hdr);
 
 private:
   class TransmissionListener;
@@ -138,7 +138,7 @@
   uint32_t GetFragmentSize (void);
   bool IsLastFragment (void);
   void NextFragment (void);
-  Packet GetFragmentPacket (WifiMacHeader *hdr);
+  Ptr<Packet> GetFragmentPacket (WifiMacHeader *hdr);
 
   Dcf *m_dcf;
   DcfManager *m_manager;
@@ -153,8 +153,7 @@
   
 
   bool m_accessOngoing;
-  Packet m_currentPacket;
-  bool m_hasCurrent;
+  Ptr<const Packet> m_currentPacket;
   WifiMacHeader m_currentHdr;
   uint32_t m_ssrc;
   uint32_t m_slrc;
--- a/src/devices/wifi/mac-high-adhoc.cc	Thu Nov 22 10:44:48 2007 +0100
+++ b/src/devices/wifi/mac-high-adhoc.cc	Thu Nov 22 14:27:22 2007 +0100
@@ -73,9 +73,9 @@
 }
 
 void 
-MacHighAdhoc::Enqueue (Packet packet, Mac48Address to)
+MacHighAdhoc::Enqueue (Ptr<const Packet> packet, Mac48Address to)
 {
-  NS_LOG_DEBUG ("enqueue size="<<packet.GetSize ()<<", to="<<to);
+  NS_LOG_DEBUG ("enqueue size="<<packet->GetSize ()<<", to="<<to);
   WifiMacHeader hdr;
   hdr.SetType (WIFI_MAC_DATA);
   hdr.SetAddr1 (to);
@@ -100,9 +100,9 @@
 }
 
 void 
-MacHighAdhoc::Receive (Packet packet, WifiMacHeader const *hdr)
+MacHighAdhoc::Receive (Ptr<Packet> packet, WifiMacHeader const *hdr)
 {
-  NS_LOG_DEBUG ("received size="<<packet.GetSize ()<<", from="<<hdr->GetAddr2 ());
+  NS_LOG_DEBUG ("received size="<<packet->GetSize ()<<", from="<<hdr->GetAddr2 ());
   m_callback (packet, hdr->GetAddr2 ());
 }
 
--- a/src/devices/wifi/mac-high-adhoc.h	Thu Nov 22 10:44:48 2007 +0100
+++ b/src/devices/wifi/mac-high-adhoc.h	Thu Nov 22 14:27:22 2007 +0100
@@ -35,7 +35,7 @@
 
 class MacHighAdhoc {
 public:
-  typedef Callback<void, Packet, const Mac48Address &> ForwardCallback;
+  typedef Callback<void, Ptr<Packet>, const Mac48Address &> ForwardCallback;
 
   MacHighAdhoc ();
   ~MacHighAdhoc ();
@@ -48,10 +48,10 @@
 
   Mac48Address GetBssid (void) const;
 
-  void Enqueue (Packet packet, Mac48Address to);
+  void Enqueue (Ptr<const Packet> packet, Mac48Address to);
 
   /* invoked by the MacLows. */
-  void Receive (Packet packet, WifiMacHeader const*hdr);
+  void Receive (Ptr<Packet> packet, WifiMacHeader const*hdr);
 private:
   DcaTxop *m_dca;
   WifiNetDevice *m_device;
--- a/src/devices/wifi/mac-high-nqap.cc	Thu Nov 22 10:44:48 2007 +0100
+++ b/src/devices/wifi/mac-high-nqap.cc	Thu Nov 22 14:27:22 2007 +0100
@@ -91,7 +91,7 @@
   SendOneBeacon ();
 }
 void 
-MacHighNqap::ForwardDown (Packet packet, Mac48Address from, Mac48Address to)
+MacHighNqap::ForwardDown (Ptr<const Packet> packet, Mac48Address from, Mac48Address to)
 {
   WifiMacHeader hdr;
   hdr.SetTypeData ();
@@ -103,7 +103,7 @@
   m_dca->Queue (packet, hdr);  
 }
 void 
-MacHighNqap::Queue (Packet packet, Mac48Address to)
+MacHighNqap::Queue (Ptr<const Packet> packet, Mac48Address to)
 {
   ForwardDown (packet, m_device->GetSelfAddress (), to);
 }
@@ -137,12 +137,12 @@
   hdr.SetAddr3 (m_device->GetSelfAddress ());
   hdr.SetDsNotFrom ();
   hdr.SetDsNotTo ();
-  Packet packet;
+  Ptr<Packet> packet = Create<Packet> ();
   MgtProbeResponseHeader probe;
   probe.SetSsid (m_device->GetSsid ());
   probe.SetSupportedRates (GetSupportedRates ());
   probe.SetBeaconIntervalUs (m_beaconInterval.GetMicroSeconds ());
-  packet.AddHeader (probe);
+  packet->AddHeader (probe);
 
   m_dca->Queue (packet, hdr);
 }
@@ -157,7 +157,7 @@
   hdr.SetAddr3 (m_device->GetSelfAddress ());
   hdr.SetDsNotFrom ();
   hdr.SetDsNotTo ();
-  Packet packet;
+  Ptr<Packet> packet = Create<Packet> ();
   MgtAssocResponseHeader assoc;
   StatusCode code;
   if (success)
@@ -170,7 +170,7 @@
     }
   assoc.SetSupportedRates (GetSupportedRates ());
   assoc.SetStatusCode (code);
-  packet.AddHeader (assoc);
+  packet->AddHeader (assoc);
   
   m_dca->Queue (packet, hdr);
 }
@@ -185,12 +185,12 @@
   hdr.SetAddr3 (m_device->GetSelfAddress ());
   hdr.SetDsNotFrom ();
   hdr.SetDsNotTo ();
-  Packet packet;
+  Ptr<Packet> packet = Create<Packet> ();
   MgtBeaconHeader beacon;
   beacon.SetSsid (m_device->GetSsid ());
   beacon.SetSupportedRates (GetSupportedRates ());
   beacon.SetBeaconIntervalUs (m_beaconInterval.GetMicroSeconds ());
-  packet.AddHeader (beacon);
+  packet->AddHeader (beacon);
 
   m_beaconDca->Queue (packet, hdr);
   Simulator::Schedule (m_beaconInterval, &MacHighNqap::SendOneBeacon, this);
@@ -218,7 +218,7 @@
     }
 }
 void 
-MacHighNqap::Receive (Packet packet, WifiMacHeader const *hdr)
+MacHighNqap::Receive (Ptr<Packet> packet, WifiMacHeader const *hdr)
 {
   MacStation *station = m_stations->Lookup (hdr->GetAddr2 ());
 
@@ -267,7 +267,7 @@
               // first, verify that the the station's supported
               // rate set is compatible with our Basic Rate set
               MgtAssocRequestHeader assocReq;
-              packet.RemoveHeader (assocReq);
+              packet->RemoveHeader (assocReq);
               SupportedRates rates = assocReq.GetSupportedRates ();
               bool problem = false;
               for (uint32_t i = 0; i < m_stations->GetNBasicModes (); i++)
--- a/src/devices/wifi/mac-high-nqap.h	Thu Nov 22 10:44:48 2007 +0100
+++ b/src/devices/wifi/mac-high-nqap.h	Thu Nov 22 14:27:22 2007 +0100
@@ -37,7 +37,7 @@
 
 class MacHighNqap {
 public:
-  typedef Callback<void, Packet, const Mac48Address &> ForwardCallback;
+  typedef Callback<void, Ptr<Packet>, const Mac48Address &> ForwardCallback;
 
   MacHighNqap ();
   ~MacHighNqap ();
@@ -50,13 +50,13 @@
   void SetForwardCallback (ForwardCallback callback);
   void SetBeaconInterval (Time interval);
 
-  void Queue (Packet packet, Mac48Address to);
+  void Queue (Ptr<const Packet> packet, Mac48Address to);
 
   void StartBeaconing (void);
 
-  void Receive (Packet packet, WifiMacHeader const *hdr);
+  void Receive (Ptr<Packet> packet, WifiMacHeader const *hdr);
 private:
-  void ForwardDown (Packet packet, Mac48Address from, Mac48Address to);
+  void ForwardDown (Ptr<const Packet> packet, Mac48Address from, Mac48Address to);
   void TxOk (WifiMacHeader const &hdr);
   void TxFailed (WifiMacHeader const &hdr);
   void SendProbeResp (Mac48Address to);
--- a/src/devices/wifi/mac-high-nqsta.cc	Thu Nov 22 10:44:48 2007 +0100
+++ b/src/devices/wifi/mac-high-nqsta.cc	Thu Nov 22 14:27:22 2007 +0100
@@ -161,11 +161,11 @@
   hdr.SetAddr3 (GetBroadcastBssid ());
   hdr.SetDsNotFrom ();
   hdr.SetDsNotTo ();
-  Packet packet;
+  Ptr<Packet> packet = Create<Packet> ();
   MgtProbeRequestHeader probe;
   probe.SetSsid (m_device->GetSsid ());
   probe.SetSupportedRates (GetSupportedRates ());
-  packet.AddHeader (probe);
+  packet->AddHeader (probe);
   
   m_dca->Queue (packet, hdr);
 
@@ -184,11 +184,11 @@
   hdr.SetAddr3 (GetBssid ());
   hdr.SetDsNotFrom ();
   hdr.SetDsNotTo ();
-  Packet packet;
+  Ptr<Packet> packet = Create<Packet> ();
   MgtAssocRequestHeader assoc;
   assoc.SetSsid (m_device->GetSsid ());
   assoc.SetSupportedRates (GetSupportedRates ());
-  packet.AddHeader (assoc);
+  packet->AddHeader (assoc);
   
   m_dca->Queue (packet, hdr);
 
@@ -278,14 +278,14 @@
 }
 
 void 
-MacHighNqsta::Queue (Packet packet, Mac48Address to)
+MacHighNqsta::Queue (Ptr<const Packet> packet, Mac48Address to)
 {
   if (!IsAssociated ()) 
     {
       TryToEnsureAssociated ();
       return;
     }
-  //TRACE ("enqueue size="<<packet.GetSize ()<<", to="<<to);
+  //TRACE ("enqueue size="<<packet->GetSize ()<<", to="<<to);
   WifiMacHeader hdr;
   hdr.SetTypeData ();
   hdr.SetAddr1 (GetBssid ());
@@ -297,7 +297,7 @@
 }
 
 void 
-MacHighNqsta::Receive (Packet packet, WifiMacHeader const *hdr)
+MacHighNqsta::Receive (Ptr<Packet> packet, WifiMacHeader const *hdr)
 {
   NS_ASSERT (!hdr->IsCtl ());
   if (hdr->GetAddr1 () != m_device->GetSelfAddress () &&
@@ -319,7 +319,7 @@
   else if (hdr->IsBeacon ()) 
     {
       MgtBeaconHeader beacon;
-      packet.RemoveHeader (beacon);
+      packet->RemoveHeader (beacon);
       bool goodBeacon = false;
       if (m_device->GetSsid ().IsBroadcast () ||
           beacon.GetSsid ().IsEqual (m_device->GetSsid ()))
@@ -343,7 +343,7 @@
       if (m_state == WAIT_PROBE_RESP) 
         {
           MgtProbeResponseHeader probeResp;
-          packet.RemoveHeader (probeResp);
+          packet->RemoveHeader (probeResp);
           if (!probeResp.GetSsid ().IsEqual (m_device->GetSsid ()))
             {
               //not a probe resp for our ssid.
@@ -365,7 +365,7 @@
       if (m_state == WAIT_ASSOC_RESP) 
         {
           MgtAssocResponseHeader assocResp;
-          packet.RemoveHeader (assocResp);
+          packet->RemoveHeader (assocResp);
           if (m_assocRequestEvent.IsRunning ()) 
             {
               m_assocRequestEvent.Cancel ();
--- a/src/devices/wifi/mac-high-nqsta.h	Thu Nov 22 10:44:48 2007 +0100
+++ b/src/devices/wifi/mac-high-nqsta.h	Thu Nov 22 14:27:22 2007 +0100
@@ -40,7 +40,7 @@
 
 class MacHighNqsta {
 public:
-  typedef Callback<void, Packet, const Mac48Address &> ForwardCallback;
+  typedef Callback<void, Ptr<Packet>, const Mac48Address &> ForwardCallback;
   typedef Callback<void> AssociatedCallback;
   typedef Callback<void> DisAssociatedCallback;
 
@@ -63,9 +63,9 @@
 
   void StartActiveAssociation (void);
 
-  void Queue (Packet packet, Mac48Address to);
+  void Queue (Ptr<const Packet> packet, Mac48Address to);
 
-  void Receive (Packet packet, WifiMacHeader const *hdr);
+  void Receive (Ptr<Packet> packet, WifiMacHeader const *hdr);
 private:
   void SetBssid (Mac48Address bssid);
   Mac48Address GetBroadcastBssid (void);
--- 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);
 }
--- a/src/devices/wifi/mac-low.h	Thu Nov 22 10:44:48 2007 +0100
+++ b/src/devices/wifi/mac-low.h	Thu Nov 22 14:27:22 2007 +0100
@@ -274,7 +274,7 @@
  */
 class MacLow {
 public:
-  typedef Callback<void, Packet , WifiMacHeader const*> MacLowRxCallback;
+  typedef Callback<void, Ptr<Packet> , WifiMacHeader const*> MacLowRxCallback;
 
   MacLow ();
   ~MacLow ();
@@ -318,7 +318,7 @@
    * Start the transmission of the input packet and notify the listener
    * of transmission events.
    */
-  void StartTransmission (Packet packet, 
+  void StartTransmission (Ptr<const Packet> packet, 
                           WifiMacHeader const*hdr, 
                           MacLowTransmissionParameters parameters,
                           MacLowTransmissionListener *listener);
@@ -332,7 +332,7 @@
    * This method is typically invoked by the lower PHY layer to notify
    * the MAC layer that a packet was successfully received.
    */
-  void ReceiveOk (Packet packet, double rxSnr, WifiMode txMode, WifiPreamble preamble);
+  void ReceiveOk (Ptr<Packet> packet, double rxSnr, WifiMode txMode, WifiPreamble preamble);
   /**
    * \param packet packet received.
    * \param rxSnr snr of packet received.
@@ -340,7 +340,7 @@
    * This method is typically invoked by the lower PHY layer to notify
    * the MAC layer that a packet was unsuccessfully received.
    */
-  void ReceiveError (Packet packet, double rxSnr);
+  void ReceiveError (Ptr<Packet> packet, double rxSnr);
 private:
   void CancelAllEvents (void);
   uint32_t GetAckSize (void) const;
@@ -353,7 +353,7 @@
   uint32_t GetCurrentSize (void) const;
   Time NowUs (void) const;
   MacStation *GetStation (Mac48Address to) const;
-  void ForwardDown (Packet const packet, WifiMacHeader const *hdr, 
+  void ForwardDown (Ptr<const Packet> packet, WifiMacHeader const *hdr, 
                     WifiMode txMode);
   Time CalculateOverallTxTime (uint32_t size,
                                Mac48Address to,
@@ -406,8 +406,7 @@
   EventId m_waitSifsEvent;
   EventId m_navCounterResetCtsMissed;
 
-  Packet m_currentPacket;
-  bool m_hasCurrent;
+  Ptr<Packet> m_currentPacket;
   WifiMacHeader m_currentHdr;
   MacLowTransmissionParameters m_txParams;
   MacLowTransmissionListener *m_listener;
@@ -415,7 +414,7 @@
   Time m_lastNavStart;
   Time m_lastNavDuration;
 
-  CallbackTraceSource<Packet> m_dropError;
+  CallbackTraceSource<Ptr<const Packet> > m_dropError;
 };
 
 } // namespace ns3
--- a/src/devices/wifi/mac-rx-middle.cc	Thu Nov 22 10:44:48 2007 +0100
+++ b/src/devices/wifi/mac-rx-middle.cc	Thu Nov 22 14:27:22 2007 +0100
@@ -36,8 +36,8 @@
 
 class OriginatorRxStatus {
 private:
-  typedef std::list<Packet> Fragments;
-  typedef std::list<Packet>::const_iterator FragmentsCI;
+  typedef std::list<Ptr<const Packet> > Fragments;
+  typedef std::list<Ptr<const Packet> >::const_iterator FragmentsCI;
 
   bool m_defragmenting;
   uint16_t m_lastSequenceControl;
@@ -49,33 +49,29 @@
     m_defragmenting = false;
   }
   ~OriginatorRxStatus () {
-    for (FragmentsCI i = m_fragments.begin (); i != m_fragments.end (); i++) 
-      {
-        // XXX ?
-      }
-    m_fragments.erase (m_fragments.begin (), m_fragments.end ());
+    m_fragments.clear ();
   }
   bool IsDeFragmenting (void) {
     return m_defragmenting;
   }
-  void AccumulateFirstFragment (Packet const packet) {
+  void AccumulateFirstFragment (Ptr<const Packet> packet) {
     NS_ASSERT (!m_defragmenting);
     m_defragmenting = true;
     m_fragments.push_back (packet);
   }
-  Packet AccumulateLastFragment (Packet const packet) {
+  Ptr<Packet> AccumulateLastFragment (Ptr<const Packet> packet) {
     NS_ASSERT (m_defragmenting);
     m_fragments.push_back (packet);
     m_defragmenting = false;
-    Packet full;
+    Ptr<Packet> full = Create<Packet> ();
     for (FragmentsCI i = m_fragments.begin (); i != m_fragments.end (); i++) 
       {
-        full.AddAtEnd (*i);
+        full->AddAtEnd (*i);
       }
     m_fragments.erase (m_fragments.begin (), m_fragments.end ());
     return full;
   }
-  void AccumulateFragment (Packet const packet) {
+  void AccumulateFragment (Ptr<const Packet> packet) {
     NS_ASSERT (m_defragmenting);
     m_fragments.push_back (packet);
   }
@@ -196,9 +192,9 @@
   return false;
 }
 
-Packet 
-MacRxMiddle::HandleFragments (Packet packet, WifiMacHeader const*hdr,
-             OriginatorRxStatus *originator, bool *complete)
+Ptr<Packet>
+MacRxMiddle::HandleFragments (Ptr<Packet> packet, WifiMacHeader const*hdr,
+                              OriginatorRxStatus *originator)
 {
   if (originator->IsDeFragmenting ()) 
     {
@@ -208,7 +204,7 @@
             {
               TRACE ("accumulate fragment seq="<<hdr->GetSequenceNumber ()<<
                      ", frag="<<hdr->GetFragmentNumber ()<<
-                     ", size="<<packet.GetSize ());
+                     ", size="<<packet->GetSize ());
               originator->AccumulateFragment (packet);
               originator->SetSequenceControl (hdr->GetSequenceControl ());
             } 
@@ -216,8 +212,7 @@
             {
               TRACE ("non-ordered fragment");
             }
-          *complete = false;
-          return Packet ();
+          return 0;
         } 
       else 
         {
@@ -226,16 +221,14 @@
               TRACE ("accumulate last fragment seq="<<hdr->GetSequenceNumber ()<<
                      ", frag="<<hdr->GetFragmentNumber ()<<
                      ", size="<<hdr->GetSize ());
-              packet = originator->AccumulateLastFragment (packet);
+              Ptr<Packet> p = originator->AccumulateLastFragment (packet);
               originator->SetSequenceControl (hdr->GetSequenceControl ());
-              *complete = true;
-              return packet;
+              return p;
             } 
           else 
             {
               TRACE ("non-ordered fragment");
-              *complete = false;
-              return Packet ();
+              return 0;
             }
         }
     } 
@@ -245,22 +238,20 @@
         {
           TRACE ("accumulate first fragment seq="<<hdr->GetSequenceNumber ()<<
                  ", frag="<<hdr->GetFragmentNumber ()<<
-                 ", size="<<packet.GetSize ());
+                 ", size="<<packet->GetSize ());
           originator->AccumulateFirstFragment (packet);
           originator->SetSequenceControl (hdr->GetSequenceControl ());
-          *complete = false;
-          return Packet ();
+          return 0;
         } 
       else 
         {
-          *complete = true;
           return packet;
         }
     }
 }
 
 void
-MacRxMiddle::Receive (Packet packet, WifiMacHeader const *hdr)
+MacRxMiddle::Receive (Ptr<Packet> packet, WifiMacHeader const *hdr)
 {
   OriginatorRxStatus *originator = Lookup (hdr);
   if (hdr->IsData ()) 
@@ -286,9 +277,8 @@
                  ", frag="<<hdr->GetFragmentNumber ());
           return;
         }
-      bool complete;
-      Packet agregate = HandleFragments (packet, hdr, originator, &complete);
-      if (!complete) 
+      Ptr<Packet> agregate = HandleFragments (packet, hdr, originator);
+      if (agregate == 0) 
         {
           return;
         }
--- a/src/devices/wifi/mac-rx-middle.h	Thu Nov 22 10:44:48 2007 +0100
+++ b/src/devices/wifi/mac-rx-middle.h	Thu Nov 22 14:27:22 2007 +0100
@@ -35,19 +35,19 @@
 class MacRxMiddle
 {
 public:
-  typedef Callback<void, Packet , WifiMacHeader const *> ForwardUpCallback;
+  typedef Callback<void, Ptr<Packet> , WifiMacHeader const *> ForwardUpCallback;
 
   MacRxMiddle ();
   ~MacRxMiddle ();
 
   void SetForwardCallback (ForwardUpCallback callback);
 
-  void Receive (Packet packet, WifiMacHeader const *hdr);
+  void Receive (Ptr<Packet> packet, WifiMacHeader const *hdr);
 private:
   OriginatorRxStatus *Lookup (WifiMacHeader const*hdr);
   bool IsDuplicate (WifiMacHeader const *hdr, OriginatorRxStatus *originator) const;
-  Packet HandleFragments (Packet packet, WifiMacHeader const*hdr,
-                          OriginatorRxStatus *originator, bool *complete);
+  Ptr<Packet> HandleFragments (Ptr<Packet> packet, WifiMacHeader const*hdr,
+                               OriginatorRxStatus *originator);
   bool SequenceControlSmaller (int seqa, int seqb);
 
   typedef std::map <Mac48Address, OriginatorRxStatus *, std::less<Mac48Address> > Originators;
--- a/src/devices/wifi/wifi-channel.cc	Thu Nov 22 10:44:48 2007 +0100
+++ b/src/devices/wifi/wifi-channel.cc	Thu Nov 22 14:27:22 2007 +0100
@@ -57,7 +57,7 @@
   m_deviceList.push_back (std::make_pair (device, callback));
 }
 void 
-WifiChannel::Send (Ptr<NetDevice> sender, const Packet &packet, double txPowerDbm,
+WifiChannel::Send (Ptr<NetDevice> sender, Ptr<const Packet> packet, double txPowerDbm,
                    WifiMode wifiMode, WifiPreamble preamble) const
 {
   Ptr<MobilityModel> senderMobility = sender->GetNode ()->QueryInterface<MobilityModel> (MobilityModel::iid);
@@ -71,15 +71,16 @@
           double rxPowerDbm = m_loss->GetRxPower (txPowerDbm, senderMobility, receiverMobility);
           NS_LOG_DEBUG ("propagation: txPower="<<txPowerDbm<<"dbm, rxPower="<<rxPowerDbm<<"dbm, "<<
                         "distance="<<senderMobility->GetDistanceFrom (receiverMobility)<<"m, delay="<<delay);
+          Ptr<Packet> copy = packet->Copy ();
           Simulator::Schedule (delay, &WifiChannel::Receive, this, 
-                               j, packet, rxPowerDbm, wifiMode, preamble);
+                               j, copy, rxPowerDbm, wifiMode, preamble);
         }
       j++;
     }
 }
 
 void
-WifiChannel::Receive (uint32_t i, const Packet &packet, double rxPowerDbm,
+WifiChannel::Receive (uint32_t i, Ptr<Packet> packet, double rxPowerDbm,
                       WifiMode txMode, WifiPreamble preamble) const
 {
   m_deviceList[i].second (packet, rxPowerDbm, txMode, preamble);
--- a/src/devices/wifi/wifi-channel.h	Thu Nov 22 10:44:48 2007 +0100
+++ b/src/devices/wifi/wifi-channel.h	Thu Nov 22 14:27:22 2007 +0100
@@ -53,7 +53,7 @@
    * arg3: the tx mode of the packet to receive
    * arg4: the preamble of the packet to receive
    */
-  typedef Callback<void,Packet,double,WifiMode,WifiPreamble> ReceiveCallback;
+  typedef Callback<void,Ptr<Packet>,double,WifiMode,WifiPreamble> ReceiveCallback;
   WifiChannel ();
   virtual ~WifiChannel ();
 
@@ -94,12 +94,12 @@
    * This method should not be invoked by normal users. It is 
    * currently invoked only from WifiPhy::Send.
    */
-  void Send (Ptr<NetDevice> sender, const Packet &packet, double txPowerDbm,
+  void Send (Ptr<NetDevice> sender, Ptr<const Packet> packet, double txPowerDbm,
              WifiMode wifiMode, WifiPreamble preamble) const;
 
 private:
   typedef std::vector<std::pair<Ptr<NetDevice>, ReceiveCallback> > DeviceList;
-  void Receive (uint32_t i, const Packet &packet, double rxPowerDbm,
+  void Receive (uint32_t i, Ptr<Packet> packet, double rxPowerDbm,
                 WifiMode txMode, WifiPreamble preamble) const;
   /**
    * \param i index of the requested network interface.
--- a/src/devices/wifi/wifi-mac-queue.cc	Thu Nov 22 10:44:48 2007 +0100
+++ b/src/devices/wifi/wifi-mac-queue.cc	Thu Nov 22 14:27:22 2007 +0100
@@ -27,9 +27,9 @@
 
 namespace ns3 {
 
-WifiMacQueue::Item::Item (Packet packet, 
-                            WifiMacHeader const &hdr, 
-                            Time tstamp)
+WifiMacQueue::Item::Item (Ptr<const Packet> packet, 
+                          WifiMacHeader const &hdr, 
+                          Time tstamp)
   : packet (packet), hdr (hdr), tstamp (tstamp)
 {}
 
@@ -53,7 +53,7 @@
   m_maxDelay = delay;
 }
 void 
-WifiMacQueue::Enqueue (Packet packet, WifiMacHeader const &hdr)
+WifiMacQueue::Enqueue (Ptr<const Packet> packet, WifiMacHeader const &hdr)
 {
   Cleanup ();
   if (m_size == m_maxSize) 
@@ -88,8 +88,8 @@
   m_queue.erase (m_queue.begin (), end);
 }
 
-Packet 
-WifiMacQueue::Dequeue (WifiMacHeader *hdr, bool *found)
+Ptr<const Packet>
+WifiMacQueue::Dequeue (WifiMacHeader *hdr)
 {
   Cleanup ();
   if (!m_queue.empty ()) 
@@ -98,11 +98,9 @@
       m_queue.pop_front ();
       m_size--;
       *hdr = i.hdr;
-      *found = true;
       return i.packet;
     }
-  *found = false;
-  return Packet ();
+  return 0;
 }
 
 
--- a/src/devices/wifi/wifi-mac-queue.h	Thu Nov 22 10:44:48 2007 +0100
+++ b/src/devices/wifi/wifi-mac-queue.h	Thu Nov 22 14:27:22 2007 +0100
@@ -53,8 +53,8 @@
   void SetMaxSize (uint32_t maxSize);
   void SetMaxDelay (Time delay);
 
-  void Enqueue (Packet packet, WifiMacHeader const &hdr);
-  Packet Dequeue (WifiMacHeader *hdr, bool *found);
+  void Enqueue (Ptr<const Packet> packet, WifiMacHeader const &hdr);
+  Ptr<const Packet> Dequeue (WifiMacHeader *hdr);
 
   void Flush (void);
 
@@ -64,10 +64,10 @@
 private:
   void Cleanup (void);
   struct Item {
-    Item (Packet packet, 
+    Item (Ptr<const Packet> packet, 
           WifiMacHeader const&hdr, 
           Time tstamp);
-    Packet packet;
+    Ptr<const Packet> packet;
     WifiMacHeader hdr;
     Time tstamp;
   };
--- a/src/devices/wifi/wifi-net-device.cc	Thu Nov 22 10:44:48 2007 +0100
+++ b/src/devices/wifi/wifi-net-device.cc	Thu Nov 22 14:27:22 2007 +0100
@@ -299,29 +299,27 @@
   NotifyConnected ();
 }
 bool
-WifiNetDevice::SendTo (const Packet &packet, const Address &to, uint16_t protocolNumber)
+WifiNetDevice::SendTo (Ptr<Packet> packet, const Address &to, uint16_t protocolNumber)
 {
   NS_ASSERT (Mac48Address::IsMatchingType (to));
 
   Mac48Address realTo = Mac48Address::ConvertFrom (to);
 
-  Packet p = packet;
-
   LlcSnapHeader llc;
   llc.SetType (protocolNumber);
-  p.AddHeader (llc);
+  packet->AddHeader (llc);
 
-  m_txLogger (p, realTo);
+  m_txLogger (packet, realTo);
 
-  return DoSendTo (p, realTo);
+  return DoSendTo (packet, realTo);
 }
 void 
-WifiNetDevice::DoForwardUp (Packet packet, const Mac48Address &from)
+WifiNetDevice::DoForwardUp (Ptr<Packet> packet, const Mac48Address &from)
 {
   m_rxLogger (packet, from);
 
   LlcSnapHeader llc;
-  packet.RemoveHeader (llc);
+  packet->RemoveHeader (llc);
   NetDevice::ForwardUp (packet, llc.GetType (), from);
 }
 Mac48Address 
@@ -415,7 +413,7 @@
   m_ssid = ssid;
 }
 bool
-AdhocWifiNetDevice::DoSendTo (const Packet &packet, Mac48Address const &to)
+AdhocWifiNetDevice::DoSendTo (Ptr<const Packet> packet, Mac48Address const &to)
 {
   m_high->Enqueue (packet, to);
   return true;
@@ -492,7 +490,7 @@
   m_high->StartActiveAssociation ();
 }
 bool
-NqstaWifiNetDevice::DoSendTo (const Packet &packet, Mac48Address const &to)
+NqstaWifiNetDevice::DoSendTo (Ptr<const Packet> packet, Mac48Address const &to)
 {
   m_high->Queue (packet, to);
   return true;
@@ -599,7 +597,7 @@
   m_high->StartBeaconing ();
 }
 bool
-NqapWifiNetDevice::DoSendTo (const Packet &packet, Mac48Address const & to)
+NqapWifiNetDevice::DoSendTo (Ptr<const Packet> packet, Mac48Address const & to)
 {
   m_high->Queue (packet, to);
   return true;
--- a/src/devices/wifi/wifi-net-device.h	Thu Nov 22 10:44:48 2007 +0100
+++ b/src/devices/wifi/wifi-net-device.h	Thu Nov 22 14:27:22 2007 +0100
@@ -106,20 +106,20 @@
   // inherited from parent.
   virtual bool DoNeedsArp (void) const;
   virtual Ptr<Channel> DoGetChannel (void) const;
-  virtual bool SendTo (const Packet &packet, const Address &to, uint16_t protocolNumber);
+  virtual bool SendTo (Ptr<Packet> packet, const Address &to, uint16_t protocolNumber);
   virtual Ptr<TraceResolver> GetTraceResolver (void) const;
   // defined for children
   virtual void NotifyConnected (void) = 0;
-  virtual bool DoSendTo (const Packet &packet, const Mac48Address &to) = 0;
+  virtual bool DoSendTo (Ptr<const Packet> packet, const Mac48Address &to) = 0;
   // private helper
   void Construct (void);
 
-  CallbackTraceSource<Packet, Mac48Address> m_rxLogger;
-  CallbackTraceSource<Packet, Mac48Address> m_txLogger;
+  CallbackTraceSource<Ptr<const Packet>, Mac48Address> m_rxLogger;
+  CallbackTraceSource<Ptr<const Packet>, Mac48Address> m_txLogger;
 protected:
   WifiNetDevice (Ptr<Node> node);
   WifiNetDevice (Ptr<Node> node, Mac48Address self);
-  void DoForwardUp (Packet packet, const Mac48Address &from);
+  void DoForwardUp (Ptr<Packet> packet, const Mac48Address &from);
   virtual void DoDispose (void);
   DcaTxop *CreateDca (uint32_t minCw, uint32_t maxCw, uint32_t aifsn) const;
 
@@ -156,7 +156,7 @@
 private:
   void DoConstruct (void);
   void ForwardUp (void);
-  virtual bool DoSendTo (const Packet &packet, Mac48Address const & to);
+  virtual bool DoSendTo (Ptr<const Packet> packet, Mac48Address const & to);
   virtual void NotifyConnected (void);
 
   Ssid m_ssid;
@@ -200,7 +200,7 @@
   void DoConstruct (void);
   void Associated (void);
   void DisAssociated (void);
-  virtual bool DoSendTo (const Packet &packet, Mac48Address const & to);
+  virtual bool DoSendTo (Ptr<const Packet> packet, Mac48Address const & to);
   virtual void NotifyConnected (void);
   friend class WifiNetDeviceFactory;
   Ssid m_ssid;
@@ -234,7 +234,7 @@
   virtual void DoDispose (void);
 private:
   void DoConstruct (void);
-  virtual bool DoSendTo (const Packet &packet, Mac48Address const & to);
+  virtual bool DoSendTo (Ptr<const Packet> packet, Mac48Address const & to);
   virtual void NotifyConnected (void);
   friend class WifiNetDeviceFactory;
   Ssid m_ssid;
--- a/src/devices/wifi/wifi-phy.cc	Thu Nov 22 10:44:48 2007 +0100
+++ b/src/devices/wifi/wifi-phy.cc	Thu Nov 22 14:27:22 2007 +0100
@@ -253,17 +253,17 @@
   m_syncErrorCallback = callback;
 }
 void 
-WifiPhy::ReceivePacket (Packet const packet, 
+WifiPhy::ReceivePacket (Ptr<Packet> packet, 
                         double rxPowerDbm,
                         WifiMode txMode,
                         enum WifiPreamble preamble)
 {
   rxPowerDbm += m_rxGainDb;
   double rxPowerW = DbmToW (rxPowerDbm);
-  Time rxDuration = CalculateTxDuration (packet.GetSize (), txMode, preamble);
+  Time rxDuration = CalculateTxDuration (packet->GetSize (), txMode, preamble);
   Time endRx = Simulator::Now () + rxDuration;
 
-  Ptr<RxEvent> event = Create<RxEvent> (packet.GetSize (), 
+  Ptr<RxEvent> event = Create<RxEvent> (packet->GetSize (), 
                                         txMode,
                                         preamble,
                                         rxDuration,
@@ -344,7 +344,7 @@
 
 }
 void 
-WifiPhy::SendPacket (Packet const packet, WifiMode txMode, WifiPreamble preamble, uint8_t txPower)
+WifiPhy::SendPacket (Ptr<const Packet> packet, WifiMode txMode, WifiPreamble preamble, uint8_t txPower)
 {
   /* Transmission can happen if:
    *  - we are syncing on a packet. It is the responsability of the
@@ -358,7 +358,7 @@
     m_endSyncEvent.Cancel ();
   }
 
-  Time txDuration = CalculateTxDuration (packet.GetSize (), txMode, preamble);
+  Time txDuration = CalculateTxDuration (packet->GetSize (), txMode, preamble);
   NotifyTxStart (txDuration);
   SwitchToTx (txDuration);
   m_channel->Send (m_device, packet, GetPowerDbm (txPower) + m_txGainDb, txMode, preamble);
@@ -1189,7 +1189,7 @@
 
 
 void
-WifiPhy::EndSync (Packet const packet, Ptr<RxEvent> event)
+WifiPhy::EndSync (Ptr<Packet> packet, Ptr<RxEvent> event)
 {
   NS_ASSERT (IsStateSync ());
   NS_ASSERT (event->GetEndTime () == Simulator::Now ());
@@ -1206,7 +1206,7 @@
   double per = CalculatePer (event, &ni);
   NS_LOG_DEBUG ("mode="<<(event->GetPayloadMode ().GetPhyRate ())<<
                 ", ber="<<(1-GetChunkSuccessRate (event->GetPayloadMode (), snr, 1))<<
-                ", snr="<<snr<<", per="<<per<<", size="<<packet.GetSize ());
+                ", snr="<<snr<<", per="<<per<<", size="<<packet->GetSize ());
   
   if (m_random.GetValue () > per) 
     {
--- a/src/devices/wifi/wifi-phy.h	Thu Nov 22 10:44:48 2007 +0100
+++ b/src/devices/wifi/wifi-phy.h	Thu Nov 22 14:27:22 2007 +0100
@@ -112,12 +112,12 @@
    * arg3: mode of packet
    * arg4: type of preamble used for packet.
    */
-  typedef Callback<void,Packet, double, WifiMode, enum WifiPreamble> SyncOkCallback;
+  typedef Callback<void,Ptr<Packet>, double, WifiMode, enum WifiPreamble> SyncOkCallback;
   /**
    * arg1: packet received unsuccessfully
    * arg2: snr of packet
    */
-  typedef Callback<void,Packet, double> SyncErrorCallback;
+  typedef Callback<void,Ptr<Packet>, double> SyncErrorCallback;
 
   /**
    * \param device the device which contains this PHY.
@@ -156,7 +156,7 @@
    * \param txPowerLevel a power level to use to send this packet. The real
    *        transmission power is calculated as txPowerMin + txPowerLevel * (txPowerMax - txPowerMin) / nTxLevels
    */
-  void SendPacket (Packet const packet, WifiMode mode, enum WifiPreamble preamble, uint8_t txPowerLevel);
+  void SendPacket (Ptr<const Packet> packet, WifiMode mode, enum WifiPreamble preamble, uint8_t txPowerLevel);
 
   /**
    * \param listener the new listener
@@ -278,7 +278,7 @@
   double CalculateSnr (double signal, double noiseInterference, WifiMode mode) const;
   double CalculateChunkSuccessRate (double snir, Time delay, WifiMode mode) const;
   double CalculatePer (Ptr<const RxEvent> event, NiChanges *ni) const;
-  void EndSync (Packet const packet, Ptr<RxEvent> event);
+  void EndSync (Ptr<Packet> packet, Ptr<RxEvent> event);
   double Log2 (double val) const;
   double GetBpskBer (double snr, uint32_t signalSpread, uint32_t phyRate) const;
   double GetQamBer (double snr, unsigned int m, uint32_t signalSpread, uint32_t phyRate) const;
@@ -297,7 +297,7 @@
                        uint32_t adFree, uint32_t adFreePlusOne) const;
   double GetChunkSuccessRate (WifiMode mode, double snr, uint32_t nbits) const;
   /* rxPower unit is Watt */
-  void ReceivePacket (Packet packet,
+  void ReceivePacket (Ptr<Packet> packet,
                       double rxPowerDbm,
                       WifiMode mode,
                       WifiPreamble preamble);