diff --git a/src/devices/mesh/dot11s/peer-link.cc b/src/devices/mesh/dot11s/peer-link.cc index e6784e588..94417d84c 100644 --- a/src/devices/mesh/dot11s/peer-link.cc +++ b/src/devices/mesh/dot11s/peer-link.cc @@ -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: diff --git a/src/devices/mesh/dot11s/peer-link.h b/src/devices/mesh/dot11s/peer-link.h index 8048ddc15..c0c61649d 100644 --- a/src/devices/mesh/dot11s/peer-link.h +++ b/src/devices/mesh/dot11s/peer-link.h @@ -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 SignalStatusCallback; + typedef Callback SignalStatusCallback; /// Set callback void MLMESetSignalStatusCallback (SignalStatusCallback); //\} @@ -136,16 +144,8 @@ private: * link management frames */ void SetMacPlugin(Ptr 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 { diff --git a/src/devices/mesh/dot11s/peer-management-protocol.cc b/src/devices/mesh/dot11s/peer-management-protocol.cc index 51d1dd754..f247adc16 100644 --- a/src/devices/mesh/dot11s/peer-management-protocol.cc +++ b/src/devices/mesh/dot11s/peer-management-protocol.cc @@ -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 link = FindPeerLink (interface, peerAddress); NS_ASSERT (link == 0); } - if(!m_peerStatusCallback.IsNull ()) - m_peerStatusCallback (peerMeshPointAddress, peerAddress, interface, status); } uint8_t PeerManagementProtocol::GetNumberOfLinks () diff --git a/src/devices/mesh/dot11s/peer-management-protocol.h b/src/devices/mesh/dot11s/peer-management-protocol.h index e8d44f2e3..e4dbdf139 100644 --- a/src/devices/mesh/dot11s/peer-management-protocol.h +++ b/src/devices/mesh/dot11s/peer-management-protocol.h @@ -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 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); /**