replace header mode with preamble mode
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Tue, 09 Oct 2007 11:07:05 +0200
changeset 1920 1d4864775cf8
parent 1919 46ed9ed9dac0
child 1921 4aa07179e71b
replace header mode with preamble mode
src/devices/wifi/mac-parameters.cc
src/devices/wifi/wifi-channel.cc
src/devices/wifi/wifi-channel.h
src/devices/wifi/wifi-mode.cc
src/devices/wifi/wifi-mode.h
src/devices/wifi/wifi-phy.cc
src/devices/wifi/wifi-phy.h
src/devices/wifi/wifi-preamble.h
--- a/src/devices/wifi/mac-parameters.cc	Tue Oct 09 10:21:46 2007 +0200
+++ b/src/devices/wifi/mac-parameters.cc	Tue Oct 09 11:07:05 2007 +0200
@@ -24,6 +24,7 @@
 #include "mac-parameters.h"
 #include "wifi-phy.h"
 #include "wifi-mac-header.h"
+#include "wifi-preamble.h"
 
 namespace ns3 {
 
@@ -50,13 +51,13 @@
   WifiMacHeader hdr;
   hdr.SetType (WIFI_MAC_CTL_CTS);
   m_ctsTimeout = m_sifs;
-  m_ctsTimeout += phy->CalculateTxDuration (hdr.GetSize (), phy->GetMode (0), phy->GetMode (0));
+  m_ctsTimeout += phy->CalculateTxDuration (hdr.GetSize (), phy->GetMode (0), WIFI_PREAMBLE_LONG);
   m_ctsTimeout += m_maxPropagationDelay * Scalar (2);
   m_ctsTimeout += m_slot;
 
   hdr.SetType (WIFI_MAC_CTL_ACK);
   m_ackTimeout = m_sifs;
-  m_ackTimeout += phy->CalculateTxDuration (hdr.GetSize (), phy->GetMode (0), phy->GetMode (0));
+  m_ackTimeout += phy->CalculateTxDuration (hdr.GetSize (), phy->GetMode (0), WIFI_PREAMBLE_LONG);
   m_ackTimeout += m_maxPropagationDelay * Scalar (2);
   m_ackTimeout += m_slot;
 }
--- a/src/devices/wifi/wifi-channel.cc	Tue Oct 09 10:21:46 2007 +0200
+++ b/src/devices/wifi/wifi-channel.cc	Tue Oct 09 11:07:05 2007 +0200
@@ -30,11 +30,11 @@
 namespace ns3 {
 
 WifiChannel::ReceiveData::ReceiveData (const Packet &packet, double rxPowerDbm,
-                                       WifiMode txMode, WifiMode headerMode)
+                                       WifiMode txMode, WifiPreamble preamble)
   : m_packet (packet),
     m_rxPowerDbm (rxPowerDbm),
     m_wifiMode (txMode),
-    m_headerMode (headerMode)
+    m_preamble (preamble)
 {}
 
 
@@ -61,7 +61,7 @@
 }
 void 
 WifiChannel::Send (Ptr<NetDevice> sender, const Packet &packet, double txPowerDbm,
-                   WifiMode wifiMode, WifiMode headerMode) const
+                   WifiMode wifiMode, WifiPreamble preamble) const
 {
   Ptr<MobilityModel> senderMobility = sender->GetNode ()->QueryInterface<MobilityModel> (MobilityModel::iid);
   uint32_t j = 0;
@@ -73,7 +73,7 @@
           double distance = senderMobility->GetDistanceFrom (receiverMobility);
           Time delay = m_delay->GetDelay (distance);
           double rxPowerDbm = m_loss->GetRxPower (txPowerDbm, distance);
-          struct ReceiveData data = ReceiveData (packet, rxPowerDbm, wifiMode, headerMode);
+          struct ReceiveData data = ReceiveData (packet, rxPowerDbm, wifiMode, preamble);
           Simulator::Schedule (delay, &WifiChannel::Receive, this, 
                                j, data);
         }
@@ -85,7 +85,7 @@
 WifiChannel::Receive (uint32_t i,
                       const struct ReceiveData &data) const
 {
-  m_deviceList[i].second (data.m_packet, data.m_rxPowerDbm, data.m_wifiMode, data.m_headerMode);
+  m_deviceList[i].second (data.m_packet, data.m_rxPowerDbm, data.m_wifiMode, data.m_preamble);
 }
 
 uint32_t 
--- a/src/devices/wifi/wifi-channel.h	Tue Oct 09 10:21:46 2007 +0200
+++ b/src/devices/wifi/wifi-channel.h	Tue Oct 09 11:07:05 2007 +0200
@@ -25,6 +25,7 @@
 #include "ns3/packet.h"
 #include "ns3/channel.h"
 #include "wifi-mode.h"
+#include "wifi-preamble.h"
 
 namespace ns3 {
 
@@ -35,7 +36,7 @@
 class WifiChannel : public Channel
 {
 public:
-  typedef Callback<void,Packet,double,WifiMode,WifiMode> ReceiveCallback;
+  typedef Callback<void,Packet,double,WifiMode,WifiPreamble> ReceiveCallback;
   WifiChannel ();
   virtual ~WifiChannel ();
 
@@ -47,17 +48,17 @@
 
   void Add (Ptr<NetDevice> device,  ReceiveCallback callback);
   void Send (Ptr<NetDevice> sender, const Packet &packet, double txPowerDbm,
-             WifiMode wifiMode, WifiMode headerMode) const;
+             WifiMode wifiMode, WifiPreamble preamble) const;
 
 private:
   typedef std::vector<std::pair<Ptr<NetDevice>, ReceiveCallback> > DeviceList;
   struct ReceiveData {
     ReceiveData (const Packet &packet, double rxPowerDbm,
-                 WifiMode txMode, WifiMode headerMode);
+                 WifiMode txMode, WifiPreamble preamble);
     Packet m_packet;
     double m_rxPowerDbm;
     WifiMode m_wifiMode;
-    WifiMode m_headerMode;
+    WifiPreamble m_preamble;
   };
   void Receive (uint32_t i, 
                 const struct ReceiveData &data) const;
--- a/src/devices/wifi/wifi-mode.cc	Tue Oct 09 10:21:46 2007 +0200
+++ b/src/devices/wifi/wifi-mode.cc	Tue Oct 09 11:07:05 2007 +0200
@@ -62,6 +62,7 @@
   return m_uid;
 }
 WifiMode::WifiMode ()
+  : m_uid (0)
 {}
 WifiMode::WifiMode (uint32_t uid)
   : m_uid (uid)
--- a/src/devices/wifi/wifi-mode.h	Tue Oct 09 10:21:46 2007 +0200
+++ b/src/devices/wifi/wifi-mode.h	Tue Oct 09 11:07:05 2007 +0200
@@ -63,9 +63,11 @@
    * should have different uids.
    */
   uint32_t GetUid (void) const;
+
+  // create an invalid WifiMode.
+  WifiMode ();
 private:
   friend class WifiModeFactory;
-  WifiMode ();
   WifiMode (uint32_t uid);
   uint32_t m_uid;
 };
--- a/src/devices/wifi/wifi-phy.cc	Tue Oct 09 10:21:46 2007 +0200
+++ b/src/devices/wifi/wifi-phy.cc	Tue Oct 09 11:07:05 2007 +0200
@@ -23,6 +23,7 @@
 #include "wifi-mode.h"
 #include "wifi-channel.h"
 #include "wifi-net-device.h"
+#include "wifi-preamble.h"
 #include "ns3/simulator.h"
 #include "ns3/packet.h"
 #include "ns3/random-variable.h"
@@ -103,11 +104,11 @@
 class RxEvent {
 public:
   RxEvent (uint32_t size, WifiMode payloadMode, 
-           WifiMode headerMode,
+           enum WifiPreamble preamble,
            Time duration, double rxPower)
     : m_size (size),
       m_payloadMode (payloadMode),
-      m_headerMode (headerMode),
+      m_preamble (preamble),
       m_startTime (Simulator::Now ()),
       m_endTime (m_startTime + duration),
       m_rxPowerW (rxPower),
@@ -151,14 +152,14 @@
   WifiMode GetPayloadMode (void) const {
     return m_payloadMode;
   }
-  WifiMode GetHeaderMode (void) const {
-    return m_headerMode;
+  enum WifiPreamble GetPreambleType (void) const {
+    return m_preamble;
   }
 
 private:
   uint32_t m_size;
   WifiMode m_payloadMode;
-  WifiMode m_headerMode;
+  enum WifiPreamble m_preamble;
   Time m_startTime;
   Time m_endTime;
   double m_rxPowerW;
@@ -246,15 +247,15 @@
 WifiPhy::ReceivePacket (Packet const packet, 
                         double rxPowerW,
                         WifiMode txMode,
-                        WifiMode headerMode)
+                        enum WifiPreamble preamble)
 {
-  Time rxDuration = CalculateTxDuration (packet.GetSize (), txMode, headerMode);
+  Time rxDuration = CalculateTxDuration (packet.GetSize (), txMode, preamble);
   Time endRx = Simulator::Now () + rxDuration;
   m_startRxLogger (rxDuration, rxPowerW);
 
   Ptr<RxEvent> event = Create<RxEvent> (packet.GetSize (), 
                                         txMode,
-                                        headerMode,
+                                        preamble,
                                         rxDuration,
                                         rxPowerW);
   AppendEvent (event);
@@ -335,7 +336,7 @@
   event->Unref ();
 }
 void 
-WifiPhy::SendPacket (Packet const packet, WifiMode txMode, WifiMode headerMode, uint8_t txPower)
+WifiPhy::SendPacket (Packet const packet, WifiMode txMode, WifiPreamble preamble, uint8_t txPower)
 {
   /* Transmission can happen if:
    *  - we are syncing on a packet. It is the responsability of the
@@ -349,11 +350,11 @@
     m_endSyncEvent.Cancel ();
   }
 
-  Time txDuration = CalculateTxDuration (packet.GetSize (), txMode, headerMode);
+  Time txDuration = CalculateTxDuration (packet.GetSize (), txMode, preamble);
   m_startTxLogger (txDuration, txMode.GetPhyRate (), GetPowerDbm (txPower));
   NotifyTxStart (txDuration);
   SwitchToTx (txDuration);
-  m_channel->Send (m_device, packet, GetPowerDbm (txPower) + m_txGainDbm, txMode, headerMode);
+  m_channel->Send (m_device, packet, GetPowerDbm (txPower) + m_txGainDbm, txMode, preamble);
 }
 
 void 
@@ -423,7 +424,10 @@
 void
 WifiPhy::Configure80211a (void)
 {
-  m_plcpPreambleDelayUs = 20;
+  m_plcpLongPreambleDelayUs = 20;
+  m_plcpShortPreambleDelayUs = 20;
+  m_longPlcpHeaderMode = g_6mba;
+  m_shortPlcpHeaderMode = g_6mba;
   m_plcpHeaderLength = 4 + 1 + 12 + 1 + 6 + 16 + 6;
   /* 4095 bytes at a 6Mb/s rate with a 1/2 coding rate. */
   m_maxPacketDuration = Seconds (4095.0*8.0/6000000.0*(1.0/2.0));
@@ -517,10 +521,19 @@
 
 
 Time
-WifiPhy::CalculateTxDuration (uint32_t size, WifiMode payloadMode, WifiMode headerMode) const
+WifiPhy::CalculateTxDuration (uint32_t size, WifiMode payloadMode, WifiPreamble preamble) const
 {
-  uint64_t delay = m_plcpPreambleDelayUs;
-  delay += m_plcpHeaderLength * 1000000 / headerMode.GetDataRate ();
+  uint64_t delay = 0;
+  switch (preamble) {
+  case WIFI_PREAMBLE_LONG:
+    delay += m_plcpLongPreambleDelayUs;
+    delay += m_plcpHeaderLength * 1000000 / m_longPlcpHeaderMode.GetDataRate ();
+    break;
+  case WIFI_PREAMBLE_SHORT:
+    delay += m_plcpShortPreambleDelayUs;
+    delay += m_plcpHeaderLength * 1000000 / m_shortPlcpHeaderMode.GetDataRate ();
+    break;
+  }
   uint64_t nbits = size * 8;
   delay += nbits * 1000000 / payloadMode.GetDataRate ();
   return MicroSeconds (delay);
@@ -1079,13 +1092,24 @@
   double psr = 1.0; /* Packet Success Rate */
   NiChanges::iterator j = ni->begin ();
   Time previous = (*j).GetTime ();
-  Time plcpHeaderStart = (*j).GetTime () + MicroSeconds (m_plcpPreambleDelayUs);
+  uint64_t plcpPreambleDelayUs;
+  WifiMode payloadMode = event->GetPayloadMode ();
+  WifiMode headerMode;
+  switch (event->GetPreambleType ()) {
+  case WIFI_PREAMBLE_LONG:
+    plcpPreambleDelayUs = m_plcpLongPreambleDelayUs;
+    headerMode = m_longPlcpHeaderMode;
+    break;
+  case WIFI_PREAMBLE_SHORT:
+    plcpPreambleDelayUs = m_plcpShortPreambleDelayUs;
+    headerMode = m_shortPlcpHeaderMode;
+    break;
+  }
+  Time plcpHeaderStart = (*j).GetTime () + MicroSeconds (plcpPreambleDelayUs);
   Time plcpPayloadStart = plcpHeaderStart + 
-    Seconds (m_plcpHeaderLength / event->GetHeaderMode ().GetDataRate ());
+    Seconds (m_plcpHeaderLength / headerMode.GetDataRate ());
   double noiseInterferenceW = (*j).GetDelta ();
   double powerW = event->GetRxPowerW ();
-  WifiMode payloadMode = event->GetPayloadMode ();
-  WifiMode headerMode = event->GetHeaderMode ();
 
   j++;
   while (ni->end () != j) 
@@ -1186,7 +1210,7 @@
       m_endSyncLogger (true);
       NotifySyncEndOk ();
       SwitchFromSync ();
-      m_syncOkCallback (packet, snr, event->GetPayloadMode (), event->GetHeaderMode ());
+      m_syncOkCallback (packet, snr, event->GetPayloadMode (), event->GetPreambleType ());
     } 
   else 
     {
--- a/src/devices/wifi/wifi-phy.h	Tue Oct 09 10:21:46 2007 +0200
+++ b/src/devices/wifi/wifi-phy.h	Tue Oct 09 11:07:05 2007 +0200
@@ -33,6 +33,7 @@
 #include "ns3/ptr.h"
 #include "ns3/random-variable.h"
 #include "wifi-mode.h"
+#include "wifi-preamble.h"
 
 
 namespace ns3 {
@@ -71,7 +72,7 @@
 class WifiPhy
 {
 public:
-  typedef Callback<void,Packet const , double, WifiMode, WifiMode> SyncOkCallback;
+  typedef Callback<void,Packet const , double, WifiMode, enum WifiPreamble> SyncOkCallback;
   typedef Callback<void,Packet const , double> SyncErrorCallback;
 
   WifiPhy (Ptr<WifiNetDevice> device);
@@ -82,7 +83,7 @@
   void SetReceiveOkCallback (SyncOkCallback callback);
   void SetReceiveErrorCallback (SyncErrorCallback callback);
 
-  void SendPacket (Packet const packet, WifiMode mode, WifiMode headerMode, uint8_t txPower);
+  void SendPacket (Packet const packet, WifiMode mode, enum WifiPreamble preamble, uint8_t txPower);
 
   void RegisterListener (WifiPhyListener *listener);
 
@@ -94,7 +95,7 @@
   Time GetStateDuration (void);
   Time GetDelayUntilIdle (void);
 
-  Time CalculateTxDuration (uint32_t size, WifiMode payloadMode, WifiMode headerMode) const;
+  Time CalculateTxDuration (uint32_t size, WifiMode payloadMode, enum WifiPreamble preamble) const;
 
   void Configure80211a (void);
   void SetEdThresholdDbm (double rxThreshold);
@@ -179,10 +180,13 @@
   void ReceivePacket (Packet packet,
                       double rxPowerW,
                       WifiMode mode,
-                      WifiMode headerMode);
+                      WifiPreamble preamble);
 private:
   uint64_t m_txPrepareDelayUs;
-  uint64_t m_plcpPreambleDelayUs;
+  uint64_t m_plcpLongPreambleDelayUs;
+  uint64_t m_plcpShortPreambleDelayUs;
+  WifiMode m_longPlcpHeaderMode;
+  WifiMode m_shortPlcpHeaderMode;
   uint32_t m_plcpHeaderLength;
   Time     m_maxPacketDuration;
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/devices/wifi/wifi-preamble.h	Tue Oct 09 11:07:05 2007 +0200
@@ -0,0 +1,13 @@
+#ifndef WIFI_PREAMBLE_H
+#define WIFI_PREAMBLE_H
+
+namespace ns3 {
+
+enum WifiPreamble {
+  WIFI_PREAMBLE_LONG,
+  WIFI_PREAMBLE_SHORT
+};
+
+} // namespace ns3
+
+#endif /* WIFI_PREAMBLE_H */