Added closing link due to transmission failure.
authorKirill Andreev <andreev@iitp.ru>
Thu, 20 Aug 2009 18:24:23 +0400
changeset 5154 bb06787ed7fe
parent 5153 37f7a0d8eae5
child 5155 e4602e638487
Added closing link due to transmission failure.
src/devices/mesh/dot11s/peer-link.cc
src/devices/mesh/dot11s/peer-link.h
src/devices/mesh/dot11s/peer-management-protocol-mac.cc
src/devices/mesh/dot11s/peer-management-protocol-mac.h
src/devices/mesh/dot11s/peer-management-protocol.cc
src/devices/mesh/dot11s/peer-management-protocol.h
src/devices/mesh/mesh-wifi-interface-mac.cc
src/devices/mesh/mesh-wifi-interface-mac.h
--- a/src/devices/mesh/dot11s/peer-link.cc	Tue Aug 18 13:31:37 2009 +0400
+++ b/src/devices/mesh/dot11s/peer-link.cc	Thu Aug 20 18:24:23 2009 +0400
@@ -73,6 +73,13 @@
                         &PeerLink::m_maxBeaconLoss),
                     MakeUintegerChecker<uint16_t> (1)
                   )
+    .AddAttribute ( "MaxPacketFailure",
+                    "Maximum number of failed packets before link will be closed",
+                    UintegerValue (2),
+                    MakeUintegerAccessor (
+                        &PeerLink::m_maxPacketFail),
+                    MakeUintegerChecker<uint16_t> (1)
+                  )
                   ;
   return tid;
 }
@@ -83,7 +90,7 @@
 //-----------------------------------------------------------------------------
 PeerLink::PeerLink () :
   m_peerAddress (Mac48Address::GetBroadcast ()), m_peerMeshPointAddress (Mac48Address::GetBroadcast ()),
-      m_localLinkId (0), m_peerLinkId (0), m_state (IDLE), m_retryCounter (0)
+      m_localLinkId (0), m_peerLinkId (0), m_packetFail (0), m_state (IDLE), m_retryCounter (0), m_maxPacketFail (3)
 {
 }
 PeerLink::~PeerLink ()
@@ -144,6 +151,24 @@
   StateMachine (CNCL);
 }
 void
+PeerLink::TransmissionSuccess ()
+{
+  std::cerr << "TX OK!\n";
+  m_packetFail = 0;
+}
+void
+PeerLink::TransmissionFailure ()
+{
+  m_packetFail ++;
+  std::cerr << "TX FAIL!\n";
+  if (m_packetFail == m_maxPacketFail)
+    {
+      StateMachine (CNCL);
+      m_packetFail = 0;
+    }
+}
+
+void
 PeerLink::SetBeaconTimingElement (IeBeaconTiming beaconTiming)
 {
   m_beaconTiming = beaconTiming;
--- a/src/devices/mesh/dot11s/peer-link.h	Tue Aug 18 13:31:37 2009 +0400
+++ b/src/devices/mesh/dot11s/peer-link.h	Thu Aug 20 18:24:23 2009 +0400
@@ -99,6 +99,9 @@
   typedef Callback<void, uint32_t, Mac48Address, Mac48Address, PeerLink::PeerState, PeerLink::PeerState> SignalStatusCallback;
   /// Set callback
   void MLMESetSignalStatusCallback (SignalStatusCallback);
+  /// Reports about transmission success/failure
+  void TransmissionSuccess ();
+  void TransmissionFailure ();
   //\}
   ///\brief Statistics
   void Report (std::ostream & os) const;
@@ -220,6 +223,8 @@
   Time  m_lastBeacon;
   /// Current beacon interval on corresponding interface
   Time  m_beaconInterval;
+  /// How many successive packets were failed to transmit
+  uint16_t m_packetFail;
 
   /// Current state
   PeerState m_state;
@@ -244,7 +249,8 @@
   EventId  m_confirmTimer;
   uint16_t m_retryCounter;
   EventId  m_beaconLossTimer;
-  uint16_t  m_maxBeaconLoss;
+  uint16_t m_maxBeaconLoss;
+  uint16_t m_maxPacketFail;
   //\}
 
   /// Several successive beacons were lost, close link
--- a/src/devices/mesh/dot11s/peer-management-protocol-mac.cc	Tue Aug 18 13:31:37 2009 +0400
+++ b/src/devices/mesh/dot11s/peer-management-protocol-mac.cc	Thu Aug 20 18:24:23 2009 +0400
@@ -46,8 +46,19 @@
 PeerManagementProtocolMac::SetParent (Ptr<MeshWifiInterfaceMac> parent)
 {
   m_parent = parent;
+  m_parent->TraceConnectWithoutContext ("TxErrHeader", MakeCallback (&PeerManagementProtocolMac::TxError, this));
+  m_parent->TraceConnectWithoutContext ("TxOkHeader",  MakeCallback (&PeerManagementProtocolMac::TxOk,    this));
 }
-
+void
+PeerManagementProtocolMac::TxError (WifiMacHeader const &hdr)
+{
+  m_protocol->TransmissionFailure (m_ifIndex, hdr.GetAddr1 ());
+}
+void
+PeerManagementProtocolMac::TxOk (WifiMacHeader const &hdr)
+{
+  m_protocol->TransmissionSuccess (m_ifIndex, hdr.GetAddr1 ());
+}
 bool
 PeerManagementProtocolMac::Receive (Ptr<Packet> const_packet, const WifiMacHeader & header)
 {
--- a/src/devices/mesh/dot11s/peer-management-protocol-mac.h	Tue Aug 18 13:31:37 2009 +0400
+++ b/src/devices/mesh/dot11s/peer-management-protocol-mac.h	Thu Aug 20 18:24:23 2009 +0400
@@ -103,6 +103,9 @@
   /// WifiInformationElements exist
   PlinkFrameStart ParsePlinkFrame (Ptr<const Packet> packet);
   ///\}
+  ///// Closes link when a proper number of successive transmissions have failed
+  void TxError (WifiMacHeader const &hdr);
+  void TxOk (WifiMacHeader const &hdr);
   //Keeps statistics
   struct Statistics {
     uint16_t txOpen;
--- a/src/devices/mesh/dot11s/peer-management-protocol.cc	Tue Aug 18 13:31:37 2009 +0400
+++ b/src/devices/mesh/dot11s/peer-management-protocol.cc	Thu Aug 20 18:24:23 2009 +0400
@@ -284,7 +284,26 @@
       peerLink->MLMECancelPeerLink (REASON11S_MESH_CAPABILITY_POLICY_VIOLATION);
     }
 }
-
+void
+PeerManagementProtocol::TransmissionFailure (uint32_t interface, Mac48Address peerAddress)
+{
+  NS_LOG_DEBUG("transmission failed between "<<GetAddress () << " and " << peerAddress << " failed, link will be colsed");
+  Ptr<PeerLink> peerLink = FindPeerLink(interface, peerAddress);
+  if(peerLink != 0)
+    {
+      peerLink->TransmissionFailure ();
+    }
+}
+void
+PeerManagementProtocol::TransmissionSuccess (uint32_t interface, Mac48Address peerAddress)
+{
+  NS_LOG_DEBUG("transmission success "<<GetAddress () << " and " << peerAddress << " failed, link will be colsed");
+  Ptr<PeerLink> peerLink = FindPeerLink(interface, peerAddress);
+  if(peerLink != 0)
+    {
+      peerLink->TransmissionSuccess ();
+    }
+}
 Ptr<PeerLink>
 PeerManagementProtocol::InitiateLink (uint32_t interface, Mac48Address peerAddress,
     Mac48Address peerMeshPointAddress, Time lastBeacon, Time beaconInterval)
--- a/src/devices/mesh/dot11s/peer-management-protocol.h	Tue Aug 18 13:31:37 2009 +0400
+++ b/src/devices/mesh/dot11s/peer-management-protocol.h	Thu Aug 20 18:24:23 2009 +0400
@@ -125,6 +125,11 @@
    */
   void ConfigurationMismatch (uint32_t interface, Mac48Address peerAddress);
   /**
+   * Cancel peer link due to successive transmission failures
+   */
+  void TransmissionFailure (uint32_t interface, const Mac48Address peerAddress);
+  void TransmissionSuccess (uint32_t interface, const Mac48Address peerAddress);
+  /**
    * Checks if there is established link
    */
   bool IsActiveLink (uint32_t interface, Mac48Address peerAddress);
--- a/src/devices/mesh/mesh-wifi-interface-mac.cc	Tue Aug 18 13:31:37 2009 +0400
+++ b/src/devices/mesh/mesh-wifi-interface-mac.cc	Thu Aug 20 18:24:23 2009 +0400
@@ -31,6 +31,7 @@
 #include "ns3/simulator.h"
 #include "ns3/yans-wifi-phy.h"
 #include "ns3/pointer.h"
+#include "ns3/trace-source-accessor.h"
 #include "ns3/qos-tag.h"
 
 NS_LOG_COMPONENT_DEFINE ("MeshWifiInterfaceMac");
@@ -66,7 +67,18 @@
                   MakeBooleanAccessor (
                       &MeshWifiInterfaceMac::SetBeaconGeneration, &MeshWifiInterfaceMac::GetBeaconGeneration),
                   MakeBooleanChecker ()
-                  );
+                  )
+  .AddTraceSource ( "TxOkHeader",
+                    "The header of successfully transmitted packet",
+                    MakeTraceSourceAccessor (
+                      &MeshWifiInterfaceMac::m_txOkCallback)
+                  )
+  .AddTraceSource ( "TxErrHeader",
+                    "The header of unsuccessfully transmitted packet",
+                    MakeTraceSourceAccessor (
+                      &MeshWifiInterfaceMac::m_txErrCallback)
+                  )
+                  ;
   return tid;
 }
 MeshWifiInterfaceMac::MeshWifiInterfaceMac ()
@@ -681,12 +693,23 @@
   Ptr<DcaTxop> queue = Create<DcaTxop> ();
   queue->SetLow (m_low);
   queue->SetManager (m_dcfManager);
-  //queue->SetTxOkCallback (MakeCallback (&MeshWifiInterfaceMac::TxOk, this));
-  //queue->SetTxFailedCallback (MakeCallback (&MeshWifiInterfaceMac::TxFailed, this));
+  queue->SetTxOkCallback (MakeCallback (&MeshWifiInterfaceMac::TxOk, this));
+  queue->SetTxFailedCallback (MakeCallback (&MeshWifiInterfaceMac::TxFailed, this));
 
   m_queues.insert (std::make_pair (ac, queue));
 }
 void 
+MeshWifiInterfaceMac::TxOk (WifiMacHeader const &hdr)
+{
+  m_txOkCallback (hdr);
+}
+void 
+MeshWifiInterfaceMac::TxFailed (WifiMacHeader const &hdr)
+{
+  m_txErrCallback (hdr);
+}
+
+void 
 MeshWifiInterfaceMac::FinishConfigureStandard (enum WifiPhyStandard standard)
 {
   switch (standard)
--- a/src/devices/mesh/mesh-wifi-interface-mac.h	Tue Aug 18 13:31:37 2009 +0400
+++ b/src/devices/mesh/mesh-wifi-interface-mac.h	Thu Aug 20 18:24:23 2009 +0400
@@ -167,6 +167,9 @@
   virtual void ForwardUp (Ptr<Packet> packet, Mac48Address src, Mac48Address dst);
   /// Send frame. Frame is supposed to be tagged by routing information. TODO: clarify this point
   void  ForwardDown (Ptr<const Packet> packet, Mac48Address from, Mac48Address to);
+  // Notify about tx OK/Error frames:
+  void TxOk (WifiMacHeader const &hdr);
+  void TxFailed (WifiMacHeader const &hdr);
   /// Send beacon
   void SendBeacon ();
   /// Schedule next beacon
@@ -242,6 +245,8 @@
   };
   Statistics m_stats;
   ///\}
+  TracedCallback<WifiMacHeader const &> m_txOkCallback;
+  TracedCallback<WifiMacHeader const &> m_txErrCallback;
 
 };