Bug 1010 - Uan model Sleep patch
authorAndrea Sacco
Tue, 16 Aug 2011 20:22:40 +0200
changeset 7433 b29227c0eee0
parent 7432 a340d3de8107
child 7434 843bfc666dcf
Bug 1010 - Uan model Sleep patch
src/uan/model/uan-net-device.cc
src/uan/model/uan-net-device.h
src/uan/model/uan-phy-dual.h
src/uan/model/uan-phy-gen.cc
src/uan/model/uan-phy-gen.h
src/uan/model/uan-phy.h
--- a/src/uan/model/uan-net-device.cc	Tue Aug 16 19:45:08 2011 +0200
+++ b/src/uan/model/uan-net-device.cc	Tue Aug 16 20:22:40 2011 +0200
@@ -389,5 +389,11 @@
   m_mac->SetAddress (UanAddress::ConvertFrom (address));
 }
 
+void
+UanNetDevice::SetSleepMode (bool sleep)
+{
+  m_phy->SetSleepMode (sleep);
+}
+
 } // namespace ns3
 
--- a/src/uan/model/uan-net-device.h	Tue Aug 16 19:45:08 2011 +0200
+++ b/src/uan/model/uan-net-device.h	Tue Aug 16 20:22:40 2011 +0200
@@ -101,6 +101,8 @@
    */
   void Clear (void);
 
+  void SetSleepMode (bool sleep);
+
   // Purely virtual functions from base class
   virtual void SetIfIndex (const uint32_t index);
   virtual uint32_t GetIfIndex (void) const;
--- a/src/uan/model/uan-phy-dual.h	Tue Aug 16 19:45:08 2011 +0200
+++ b/src/uan/model/uan-phy-dual.h	Tue Aug 16 20:22:40 2011 +0200
@@ -248,6 +248,11 @@
    */
   void SetSinrModelPhy2 (Ptr<UanPhyCalcSinr> calcSinr);
 
+  virtual void SetSleepMode (bool sleep)
+  {
+    //TODO This method has to be implemented
+  }
+
   /**
    * \returns Packet currently being received on Phy1 (Null Ptr if none)
    */
--- a/src/uan/model/uan-phy-gen.cc	Tue Aug 16 19:45:08 2011 +0200
+++ b/src/uan/model/uan-phy-gen.cc	Tue Aug 16 20:22:40 2011 +0200
@@ -522,6 +522,11 @@
       NS_LOG_DEBUG ("PHY requested to TX while already Transmitting.  Dropping packet.");
       return;
     }
+  else if (m_state == SLEEP)
+    {
+      NS_LOG_DEBUG ("PHY requested to TX while sleeping.  Dropping packet.");
+      return;
+    }
 
   UanTxMode txMode = GetMode (modeNum);
 
@@ -544,6 +549,12 @@
 void
 UanPhyGen::TxEndEvent ()
 {
+  if (m_state == SLEEP || m_disabled == true)
+    {
+      NS_LOG_DEBUG ("Transmission ended but node sleeping or dead");
+      return;
+    }
+
   NS_ASSERT (m_state == TX);
   if (GetInterferenceDb ( (Ptr<Packet>) 0) > m_ccaThreshDb)
     {
@@ -626,7 +637,7 @@
       }
       break;
     case SLEEP:
-      NS_FATAL_ERROR ("SLEEP state handling not yet implemented!");
+      NS_LOG_DEBUG ("Sleep mode. Dropping packet.");
       break;
     }
 
@@ -646,6 +657,13 @@
       return;
     }
 
+  if (m_disabled || m_state == SLEEP)
+    {
+      NS_LOG_DEBUG ("Sleep mode or dead. Dropping packet");
+      m_pktRx = 0;
+      return;
+    }
+
   if (GetInterferenceDb ( (Ptr<Packet>) 0) > m_ccaThreshDb)
     {
       m_state = CCABUSY;
@@ -811,6 +829,26 @@
   m_transducer->AddPhy (this);
 }
 
+void
+UanPhyGen::SetSleepMode (bool sleep)
+{
+  if (sleep)
+    {
+      m_state = SLEEP;
+      if (!m_energyCallback.IsNull ())
+        {
+          m_energyCallback (SLEEP);
+        }
+    }
+  else
+    {
+      m_state = IDLE;
+      if (!m_energyCallback.IsNull ())
+        {
+          m_energyCallback (IDLE);
+        }
+    }
+}
 
 void
 UanPhyGen::NotifyTransStartTx (Ptr<Packet> packet, double txPowerDb, UanTxMode txMode)
--- a/src/uan/model/uan-phy-gen.h	Tue Aug 16 19:45:08 2011 +0200
+++ b/src/uan/model/uan-phy-gen.h	Tue Aug 16 20:22:40 2011 +0200
@@ -203,6 +203,8 @@
   virtual Ptr<Packet> GetPacketRx (void) const;
   virtual void Clear (void);
 
+  virtual void SetSleepMode (bool sleep);
+
 private:
   typedef std::list<UanPhyListener *> ListenerList;
 
--- a/src/uan/model/uan-phy.h	Tue Aug 16 19:45:08 2011 +0200
+++ b/src/uan/model/uan-phy.h	Tue Aug 16 20:22:40 2011 +0200
@@ -374,6 +374,8 @@
    * Clears all pointer references
    */
   virtual void Clear (void) = 0;
+
+  virtual void SetSleepMode (bool sleep) = 0;
 };
 
 }