diff --git a/src/devices/mesh/dot11s/peer-link.cc b/src/devices/mesh/dot11s/peer-link.cc index a50ccbbf7..66f0ed729 100644 --- a/src/devices/mesh/dot11s/peer-link.cc +++ b/src/devices/mesh/dot11s/peer-link.cc @@ -73,6 +73,13 @@ PeerLink::GetTypeId () &PeerLink::m_maxBeaconLoss), MakeUintegerChecker (1) ) + .AddAttribute ( "MaxPacketFailure", + "Maximum number of failed packets before link will be closed", + UintegerValue (2), + MakeUintegerAccessor ( + &PeerLink::m_maxPacketFail), + MakeUintegerChecker (1) + ) ; return tid; } @@ -83,7 +90,7 @@ PeerLink::GetTypeId () //----------------------------------------------------------------------------- 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 () @@ -143,6 +150,24 @@ PeerLink::BeaconLoss () { 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) { diff --git a/src/devices/mesh/dot11s/peer-link.h b/src/devices/mesh/dot11s/peer-link.h index 58ede0352..125e50d9b 100644 --- a/src/devices/mesh/dot11s/peer-link.h +++ b/src/devices/mesh/dot11s/peer-link.h @@ -99,6 +99,9 @@ public: typedef Callback 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 @@ private: 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 @@ private: 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 diff --git a/src/devices/mesh/dot11s/peer-management-protocol-mac.cc b/src/devices/mesh/dot11s/peer-management-protocol-mac.cc index 7e6a28141..141bfe646 100644 --- a/src/devices/mesh/dot11s/peer-management-protocol-mac.cc +++ b/src/devices/mesh/dot11s/peer-management-protocol-mac.cc @@ -46,8 +46,19 @@ void PeerManagementProtocolMac::SetParent (Ptr 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 const_packet, const WifiMacHeader & header) { diff --git a/src/devices/mesh/dot11s/peer-management-protocol-mac.h b/src/devices/mesh/dot11s/peer-management-protocol-mac.h index f5a62dbe8..13e9777f4 100644 --- a/src/devices/mesh/dot11s/peer-management-protocol-mac.h +++ b/src/devices/mesh/dot11s/peer-management-protocol-mac.h @@ -103,6 +103,9 @@ private: /// WifiInformationElements exist PlinkFrameStart ParsePlinkFrame (Ptr 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; diff --git a/src/devices/mesh/dot11s/peer-management-protocol.cc b/src/devices/mesh/dot11s/peer-management-protocol.cc index 0ac95d577..8caa3786b 100644 --- a/src/devices/mesh/dot11s/peer-management-protocol.cc +++ b/src/devices/mesh/dot11s/peer-management-protocol.cc @@ -284,7 +284,26 @@ PeerManagementProtocol::ConfigurationMismatch (uint32_t interface, Mac48Address peerLink->MLMECancelPeerLink (REASON11S_MESH_CAPABILITY_POLICY_VIOLATION); } } - +void +PeerManagementProtocol::TransmissionFailure (uint32_t interface, Mac48Address peerAddress) +{ + NS_LOG_DEBUG("transmission failed between "< peerLink = FindPeerLink(interface, peerAddress); + if(peerLink != 0) + { + peerLink->TransmissionFailure (); + } +} +void +PeerManagementProtocol::TransmissionSuccess (uint32_t interface, Mac48Address peerAddress) +{ + NS_LOG_DEBUG("transmission success "< peerLink = FindPeerLink(interface, peerAddress); + if(peerLink != 0) + { + peerLink->TransmissionSuccess (); + } +} Ptr PeerManagementProtocol::InitiateLink (uint32_t interface, Mac48Address peerAddress, Mac48Address peerMeshPointAddress, Time lastBeacon, Time beaconInterval) diff --git a/src/devices/mesh/dot11s/peer-management-protocol.h b/src/devices/mesh/dot11s/peer-management-protocol.h index 946483bfa..182c7e491 100644 --- a/src/devices/mesh/dot11s/peer-management-protocol.h +++ b/src/devices/mesh/dot11s/peer-management-protocol.h @@ -124,6 +124,11 @@ public: * rates) */ 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 */ diff --git a/src/devices/mesh/mesh-wifi-interface-mac.cc b/src/devices/mesh/mesh-wifi-interface-mac.cc index dd31a35b2..6e320aed0 100644 --- a/src/devices/mesh/mesh-wifi-interface-mac.cc +++ b/src/devices/mesh/mesh-wifi-interface-mac.cc @@ -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 @@ MeshWifiInterfaceMac::GetTypeId () 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,11 +693,22 @@ MeshWifiInterfaceMac::SetQueue (AccessClass ac) Ptr queue = Create (); 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) { diff --git a/src/devices/mesh/mesh-wifi-interface-mac.h b/src/devices/mesh/mesh-wifi-interface-mac.h index c7acea8d0..4ea934f4d 100644 --- a/src/devices/mesh/mesh-wifi-interface-mac.h +++ b/src/devices/mesh/mesh-wifi-interface-mac.h @@ -167,6 +167,9 @@ private: virtual void ForwardUp (Ptr packet, Mac48Address src, Mac48Address dst); /// Send frame. Frame is supposed to be tagged by routing information. TODO: clarify this point void ForwardDown (Ptr 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 @@ private: }; Statistics m_stats; ///\} + TracedCallback m_txOkCallback; + TracedCallback m_txErrCallback; };