Fixed peer link status notification

This commit is contained in:
Kirill Andreev
2009-06-18 16:51:28 +04:00
parent c9536cdbf0
commit c468013d95
4 changed files with 48 additions and 21 deletions

View File

@@ -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:

View File

@@ -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
{

View File

@@ -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 ()

View File

@@ -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);
/**