Fixed peer link status notification
This commit is contained in:
@@ -285,18 +285,20 @@ PeerLink::StateMachine (PeerEvent event,PmpReasonCode reasoncode)
|
||||
case CNCL:
|
||||
case CLS_ACPT:
|
||||
m_state = IDLE;
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, false);
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, IDLE, IDLE);
|
||||
break;
|
||||
case REQ_RJCT:
|
||||
SendPeerLinkClose (reasoncode);
|
||||
break;
|
||||
case ACTOPN:
|
||||
m_state = OPN_SNT;
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, IDLE, OPN_SNT);
|
||||
SendPeerLinkOpen ();
|
||||
SetRetryTimer ();
|
||||
break;
|
||||
case OPN_ACPT:
|
||||
m_state = OPN_RCVD;
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, IDLE, OPN_RCVD);
|
||||
SendPeerLinkConfirm ();
|
||||
SendPeerLinkOpen ();
|
||||
SetRetryTimer ();
|
||||
@@ -317,15 +319,18 @@ PeerLink::StateMachine (PeerEvent event,PmpReasonCode reasoncode)
|
||||
break;
|
||||
case CNF_ACPT:
|
||||
m_state = CNF_RCVD;
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, OPN_SNT, CNF_RCVD);
|
||||
ClearRetryTimer ();
|
||||
SetConfirmTimer ();
|
||||
break;
|
||||
case OPN_ACPT:
|
||||
m_state = OPN_RCVD;
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, OPN_SNT, OPN_RCVD);
|
||||
SendPeerLinkConfirm ();
|
||||
break;
|
||||
case CLS_ACPT:
|
||||
m_state = HOLDING;
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, OPN_SNT, HOLDING);
|
||||
ClearRetryTimer ();
|
||||
SendPeerLinkClose (REASON11S_MESH_CLOSE_RCVD);
|
||||
SetHoldingTimer ();
|
||||
@@ -333,18 +338,21 @@ PeerLink::StateMachine (PeerEvent event,PmpReasonCode reasoncode)
|
||||
case OPN_RJCT:
|
||||
case CNF_RJCT:
|
||||
m_state = HOLDING;
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, OPN_SNT, HOLDING);
|
||||
ClearRetryTimer ();
|
||||
SendPeerLinkClose (reasoncode);
|
||||
SetHoldingTimer ();
|
||||
break;
|
||||
case TOR2:
|
||||
m_state = HOLDING;
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, OPN_SNT, HOLDING);
|
||||
ClearRetryTimer ();
|
||||
SendPeerLinkClose (REASON11S_MESH_MAX_RETRIES);
|
||||
SetHoldingTimer ();
|
||||
break;
|
||||
case CNCL:
|
||||
m_state = HOLDING;
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, OPN_SNT, HOLDING);
|
||||
ClearRetryTimer ();
|
||||
SendPeerLinkClose (REASON11S_PEERING_CANCELLED);
|
||||
SetHoldingTimer ();
|
||||
@@ -362,13 +370,14 @@ PeerLink::StateMachine (PeerEvent event,PmpReasonCode reasoncode)
|
||||
break;
|
||||
case OPN_ACPT:
|
||||
m_state = ESTAB;
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, CNF_RCVD, ESTAB);
|
||||
ClearConfirmTimer ();
|
||||
SendPeerLinkConfirm ();
|
||||
NS_ASSERT(m_peerMeshPointAddress != Mac48Address::GetBroadcast ());
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, true);
|
||||
break;
|
||||
case CLS_ACPT:
|
||||
m_state = HOLDING;
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, CNF_RCVD, HOLDING);
|
||||
ClearConfirmTimer ();
|
||||
SendPeerLinkClose (REASON11S_MESH_CLOSE_RCVD);
|
||||
SetHoldingTimer ();
|
||||
@@ -376,18 +385,21 @@ PeerLink::StateMachine (PeerEvent event,PmpReasonCode reasoncode)
|
||||
case CNF_RJCT:
|
||||
case OPN_RJCT:
|
||||
m_state = HOLDING;
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, CNF_RCVD, HOLDING);
|
||||
ClearConfirmTimer ();
|
||||
SendPeerLinkClose (reasoncode);
|
||||
SetHoldingTimer ();
|
||||
break;
|
||||
case CNCL:
|
||||
m_state = HOLDING;
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, CNF_RCVD, HOLDING);
|
||||
ClearConfirmTimer ();
|
||||
SendPeerLinkClose (REASON11S_PEERING_CANCELLED);
|
||||
SetHoldingTimer ();
|
||||
break;
|
||||
case TOC:
|
||||
m_state = HOLDING;
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, CNF_RCVD, HOLDING);
|
||||
SendPeerLinkClose (REASON11S_MESH_CONFIRM_TIMEOUT);
|
||||
SetHoldingTimer ();
|
||||
break;
|
||||
@@ -407,12 +419,13 @@ PeerLink::StateMachine (PeerEvent event,PmpReasonCode reasoncode)
|
||||
break;
|
||||
case CNF_ACPT:
|
||||
m_state = ESTAB;
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, OPN_RCVD, ESTAB);
|
||||
ClearRetryTimer ();
|
||||
NS_ASSERT(m_peerMeshPointAddress != Mac48Address::GetBroadcast ());
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, true);
|
||||
break;
|
||||
case CLS_ACPT:
|
||||
m_state = HOLDING;
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, OPN_RCVD, HOLDING);
|
||||
ClearRetryTimer ();
|
||||
SendPeerLinkClose (REASON11S_MESH_CLOSE_RCVD);
|
||||
SetHoldingTimer ();
|
||||
@@ -420,18 +433,21 @@ PeerLink::StateMachine (PeerEvent event,PmpReasonCode reasoncode)
|
||||
case OPN_RJCT:
|
||||
case CNF_RJCT:
|
||||
m_state = HOLDING;
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, OPN_RCVD, HOLDING);
|
||||
ClearRetryTimer ();
|
||||
SendPeerLinkClose (reasoncode);
|
||||
SetHoldingTimer ();
|
||||
break;
|
||||
case TOR2:
|
||||
m_state = HOLDING;
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, OPN_RCVD, HOLDING);
|
||||
ClearRetryTimer ();
|
||||
SendPeerLinkClose (REASON11S_MESH_MAX_RETRIES);
|
||||
SetHoldingTimer ();
|
||||
break;
|
||||
case CNCL:
|
||||
m_state = HOLDING;
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, OPN_RCVD, HOLDING);
|
||||
ClearRetryTimer ();
|
||||
SendPeerLinkClose (REASON11S_PEERING_CANCELLED);
|
||||
SetHoldingTimer ();
|
||||
@@ -450,18 +466,21 @@ PeerLink::StateMachine (PeerEvent event,PmpReasonCode reasoncode)
|
||||
break;
|
||||
case CLS_ACPT:
|
||||
m_state = HOLDING;
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, ESTAB, HOLDING);
|
||||
SendPeerLinkClose (REASON11S_MESH_CLOSE_RCVD);
|
||||
SetHoldingTimer ();
|
||||
break;
|
||||
case OPN_RJCT:
|
||||
case CNF_RJCT:
|
||||
m_state = HOLDING;
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, ESTAB, HOLDING);
|
||||
ClearRetryTimer ();
|
||||
SendPeerLinkClose (reasoncode);
|
||||
SetHoldingTimer ();
|
||||
break;
|
||||
case CNCL:
|
||||
m_state = HOLDING;
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, ESTAB, HOLDING);
|
||||
SendPeerLinkClose (REASON11S_PEERING_CANCELLED);
|
||||
SetHoldingTimer ();
|
||||
break;
|
||||
@@ -478,17 +497,19 @@ PeerLink::StateMachine (PeerEvent event,PmpReasonCode reasoncode)
|
||||
ClearHoldingTimer ();
|
||||
case TOH:
|
||||
m_state = IDLE;
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, false);
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, HOLDING, IDLE);
|
||||
break;
|
||||
case OPN_ACPT:
|
||||
case CNF_ACPT:
|
||||
m_state = HOLDING;
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, HOLDING, HOLDING);
|
||||
// reason not spec in D2.0
|
||||
SendPeerLinkClose (REASON11S_PEERING_CANCELLED);
|
||||
break;
|
||||
case OPN_RJCT:
|
||||
case CNF_RJCT:
|
||||
m_state = HOLDING;
|
||||
m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, HOLDING, HOLDING);
|
||||
SendPeerLinkClose (reasoncode);
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -87,8 +87,16 @@ public:
|
||||
void MLMEActivePeerLinkOpen ();
|
||||
/// MLME-PeeringRequestReject
|
||||
void MLMEPeeringRequestReject ();
|
||||
enum PeerState {
|
||||
IDLE,
|
||||
OPN_SNT,
|
||||
CNF_RCVD,
|
||||
OPN_RCVD,
|
||||
ESTAB,
|
||||
HOLDING,
|
||||
};
|
||||
/// Callback type for MLME-SignalPeerLinkStatus event
|
||||
typedef Callback<void, uint32_t, Mac48Address, Mac48Address, bool> SignalStatusCallback;
|
||||
typedef Callback<void, uint32_t, Mac48Address, Mac48Address, PeerLink::PeerState, PeerLink::PeerState> SignalStatusCallback;
|
||||
/// Set callback
|
||||
void MLMESetSignalStatusCallback (SignalStatusCallback);
|
||||
//\}
|
||||
@@ -136,16 +144,8 @@ private:
|
||||
* link management frames
|
||||
*/
|
||||
void SetMacPlugin(Ptr<PeerManagerMacPlugin> plugin);
|
||||
private:
|
||||
/// Peer link states, see 802.11s draft 11B.3.3.1
|
||||
enum PeerState {
|
||||
IDLE,
|
||||
OPN_SNT,
|
||||
CNF_RCVD,
|
||||
OPN_RCVD,
|
||||
ESTAB,
|
||||
HOLDING,
|
||||
};
|
||||
private:
|
||||
/// Peer link events, see 802.11s draft 11B.3.3.2
|
||||
enum PeerEvent
|
||||
{
|
||||
|
||||
@@ -416,7 +416,7 @@ PeerManagementProtocol::TimeToTu (Time x)
|
||||
return (uint32_t) (x.GetMicroSeconds ()/1024);
|
||||
}
|
||||
void
|
||||
PeerManagementProtocol::PeerLinkStatus (uint32_t interface, Mac48Address peerAddress, Mac48Address peerMeshPointAddress, bool status)
|
||||
PeerManagementProtocol::PeerLinkStatus (uint32_t interface, Mac48Address peerAddress, Mac48Address peerMeshPointAddress, PeerLink::PeerState ostate, PeerLink::PeerState nstate)
|
||||
{
|
||||
PeerManagerPluginMap::iterator plugin = m_plugins.find (interface);
|
||||
NS_ASSERT(plugin != m_plugins.end());
|
||||
@@ -426,21 +426,26 @@ PeerManagementProtocol::PeerLinkStatus (uint32_t interface, Mac48Address peerAdd
|
||||
" and peer mesh point:" << peerMeshPointAddress <<
|
||||
" and its interface:" << peerAddress <<
|
||||
", at my interface ID:" << interface <<
|
||||
". Status:" << status);
|
||||
if(status)
|
||||
". State movement:" << ostate << " -> " << nstate);
|
||||
if((nstate == PeerLink::ESTAB) && (ostate != PeerLink::ESTAB))
|
||||
{
|
||||
m_stats.linksOpened ++;
|
||||
m_numberOfActivePeers ++;
|
||||
if(!m_peerStatusCallback.IsNull ())
|
||||
m_peerStatusCallback (peerMeshPointAddress, peerAddress, interface, true);
|
||||
}
|
||||
else
|
||||
if((ostate == PeerLink::ESTAB) && (nstate != PeerLink::ESTAB))
|
||||
{
|
||||
m_stats.linksClosed ++;
|
||||
m_numberOfActivePeers --;
|
||||
if(!m_peerStatusCallback.IsNull ())
|
||||
m_peerStatusCallback (peerMeshPointAddress, peerAddress, interface, false);
|
||||
}
|
||||
if (nstate == PeerLink::IDLE)
|
||||
{
|
||||
Ptr <PeerLink> link = FindPeerLink (interface, peerAddress);
|
||||
NS_ASSERT (link == 0);
|
||||
}
|
||||
if(!m_peerStatusCallback.IsNull ())
|
||||
m_peerStatusCallback (peerMeshPointAddress, peerAddress, interface, status);
|
||||
}
|
||||
uint8_t
|
||||
PeerManagementProtocol::GetNumberOfLinks ()
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#include "ie-dot11s-beacon-timing.h"
|
||||
#include "ie-dot11s-peer-management.h"
|
||||
#include "ie-dot11s-id.h"
|
||||
#include "peer-link.h"
|
||||
|
||||
#include <map>
|
||||
namespace ns3 {
|
||||
@@ -189,7 +190,7 @@ private:
|
||||
* \}
|
||||
* \brief Indicates changes in peer links
|
||||
*/
|
||||
void PeerLinkStatus (uint32_t interface, Mac48Address peerAddress, Mac48Address peerMeshPointAddres, bool status);
|
||||
void PeerLinkStatus (uint32_t interface, Mac48Address peerAddress, Mac48Address peerMeshPointAddres, PeerLink::PeerState ostate, PeerLink::PeerState nstate);
|
||||
///\brief BCA
|
||||
Time GetNextBeaconShift (uint32_t interface);
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user