From 1fb5e143a7287fab04d8dc570ca6ee74de5ba258 Mon Sep 17 00:00:00 2001 From: Kirill Andreev Date: Tue, 21 Jul 2009 12:51:09 +0400 Subject: [PATCH] Added max beacon loss to PeerManagementProtocol (for beacon timing), cosmetic changes: added {} and spaces befor '(' --- src/devices/mesh/dot11s/hwmp-protocol-mac.cc | 155 +++++++---- src/devices/mesh/dot11s/ie-dot11s-rann.cc | 6 + src/devices/mesh/dot11s/ie-dot11s-rann.h | 4 +- src/devices/mesh/dot11s/peer-link.cc | 103 ++++--- .../dot11s/peer-management-protocol-mac.cc | 75 ++--- .../mesh/dot11s/peer-management-protocol.cc | 263 +++++++++++------- .../mesh/dot11s/peer-management-protocol.h | 1 + src/devices/mesh/mesh-point-device.cc | 48 ++-- src/devices/mesh/mesh-wifi-interface-mac.cc | 72 +++-- 9 files changed, 469 insertions(+), 258 deletions(-) diff --git a/src/devices/mesh/dot11s/hwmp-protocol-mac.cc b/src/devices/mesh/dot11s/hwmp-protocol-mac.cc index c999831f2..9e1407a69 100644 --- a/src/devices/mesh/dot11s/hwmp-protocol-mac.cc +++ b/src/devices/mesh/dot11s/hwmp-protocol-mac.cc @@ -56,12 +56,12 @@ HwmpProtocolMac::ReceiveData (Ptr packet, const WifiMacHeader & header) MeshHeader meshHdr; HwmpTag tag; - if(packet->PeekPacketTag (tag)) + if (packet->PeekPacketTag (tag)) { NS_FATAL_ERROR ("HWMP tag is not supposed to be received by network"); } - packet->RemoveHeader(meshHdr); + packet->RemoveHeader (meshHdr); m_stats.rxData ++; m_stats.rxDataBytes += packet->GetSize (); @@ -79,12 +79,12 @@ HwmpProtocolMac::ReceiveData (Ptr packet, const WifiMacHeader & header) }; tag.SetSeqno (meshHdr.GetMeshSeqno ()); tag.SetTtl (meshHdr.GetMeshTtl ()); - packet->AddPacketTag(tag); + packet->AddPacketTag (tag); - if (destination == Mac48Address::GetBroadcast ()) - if(m_protocol->DropDataFrame (meshHdr.GetMeshSeqno (), source)) + if ((destination == Mac48Address::GetBroadcast ()) && (m_protocol->DropDataFrame (meshHdr.GetMeshSeqno (), source))) + { return false; - + } return true; } @@ -96,8 +96,10 @@ HwmpProtocolMac::ReceiveAction (Ptr packet, const WifiMacHeader & header WifiMeshActionHeader actionHdr; packet->RemoveHeader (actionHdr); WifiMeshActionHeader::ActionValue actionValue = actionHdr.GetAction (); - if(actionHdr.GetCategory () != WifiMeshActionHeader::MESH_PATH_SELECTION) - return true; + if (actionHdr.GetCategory () != WifiMeshActionHeader::MESH_PATH_SELECTION) + { + return true; + } IeRann rann; IePreq preq; IePrep prep; @@ -110,9 +112,13 @@ HwmpProtocolMac::ReceiveAction (Ptr packet, const WifiMacHeader & header { m_stats.rxPreq ++; if (preq.GetOriginatorAddress () == m_protocol->GetAddress ()) - continue; + { + continue; + } if (preq.GetTtl () == 0) - continue; + { + continue; + } preq.DecrementTtl (); m_protocol->ReceivePreq (preq, header.GetAddr2 (), m_ifIndex, header.GetAddr3 (), m_parent->GetLinkMetric(header.GetAddr2 ())); } @@ -120,7 +126,9 @@ HwmpProtocolMac::ReceiveAction (Ptr packet, const WifiMacHeader & header { m_stats.rxPrep ++; if (prep.GetTtl () == 0) - continue; + { + continue; + } prep.DecrementTtl (); m_protocol->ReceivePrep (prep, header.GetAddr2 (), m_ifIndex, header.GetAddr3 (), m_parent->GetLinkMetric(header.GetAddr2 ())); } @@ -133,7 +141,9 @@ HwmpProtocolMac::ReceiveAction (Ptr packet, const WifiMacHeader & header failedDestinations.push_back (*i); } if (failedDestinations.size () > 0) - m_protocol->ReceivePerr (failedDestinations, header.GetAddr2 (), m_ifIndex, header.GetAddr3 ()); + { + m_protocol->ReceivePerr (failedDestinations, header.GetAddr2 (), m_ifIndex, header.GetAddr3 ()); + } NS_ASSERT(packet->GetSize () == 0); return false; } @@ -142,17 +152,28 @@ bool HwmpProtocolMac::Receive (Ptr packet, const WifiMacHeader & header) { if (header.IsData ()) - return ReceiveData (packet, header); - else if (header.IsAction ()) - return ReceiveAction (packet, header); - else - return true; // don't care + { + return ReceiveData (packet, header); + } + else + { + if (header.IsAction ()) + { + return ReceiveAction (packet, header); + } + else + { + return true; // don't care + } + } } bool HwmpProtocolMac::UpdateOutcomingFrame (Ptr packet, WifiMacHeader & header, Mac48Address from, Mac48Address to) { - if(!header.IsData ()) - return true; + if (!header.IsData ()) + { + return true; + } HwmpTag tag; bool tagExists = packet->RemovePacketTag(tag); if (!tagExists) @@ -162,7 +183,7 @@ HwmpProtocolMac::UpdateOutcomingFrame (Ptr packet, WifiMacHeader & heade m_stats.txData ++; m_stats.txDataBytes += packet->GetSize (); MeshHeader meshHdr; - meshHdr.SetMeshSeqno (tag.GetSeqno()); + meshHdr.SetMeshSeqno (tag.GetSeqno ()); meshHdr.SetMeshTtl (tag.GetTtl()); packet->AddHeader (meshHdr); header.SetAddr1 (tag.GetAddress()); @@ -178,7 +199,7 @@ HwmpProtocolMac::GetWifiMeshActionHeader () return actionHdr; } void -HwmpProtocolMac::SendPreq(IePreq preq) +HwmpProtocolMac::SendPreq (IePreq preq) { NS_LOG_FUNCTION_NOARGS (); std::vector preq_vector; @@ -203,23 +224,25 @@ HwmpProtocolMac::SendPreq(std::vector preq) hdr.SetAddr3 (m_protocol->GetAddress ()); //Send Management frame std::vector receivers = m_protocol->GetPreqReceivers (m_ifIndex); - for(std::vector::const_iterator i = receivers.begin (); i != receivers.end (); i ++) + for (std::vector::const_iterator i = receivers.begin (); i != receivers.end (); i ++) { hdr.SetAddr1 (*i); m_stats.txPreq ++; m_stats.txMgt ++; m_stats.txMgtBytes += packet->GetSize (); - m_parent->SendManagementFrame(packet, hdr); + m_parent->SendManagementFrame (packet, hdr); } } void HwmpProtocolMac::RequestDestination (Mac48Address dst, uint32_t originator_seqno, uint32_t dst_seqno) { NS_LOG_FUNCTION_NOARGS (); - for(std::vector::iterator i = m_myPreq.begin (); i != m_myPreq.end(); i ++) + for (std::vector::iterator i = m_myPreq.begin (); i != m_myPreq.end(); i ++) { - if(i->IsFull ()) - continue; + if (i->IsFull ()) + { + continue; + } NS_ASSERT (i->GetDestCount () > 0); i->AddDestinationAddressElement (m_protocol->GetDoFlag(), m_protocol->GetRfFlag(), dst, dst_seqno); } @@ -238,10 +261,14 @@ void HwmpProtocolMac::SendMyPreq () { NS_LOG_FUNCTION_NOARGS (); - if(m_preqTimer.IsRunning ()) - return; - if(m_myPreq.size () == 0) - return; + if (m_preqTimer.IsRunning ()) + { + return; + } + if (m_myPreq.size () == 0) + { + return; + } //reschedule sending PREQ NS_ASSERT (!m_preqTimer.IsRunning()); m_preqTimer = Simulator::Schedule (m_protocol->GetPreqMinInterval (), &HwmpProtocolMac::SendMyPreq, this); @@ -276,18 +303,22 @@ HwmpProtocolMac::ForwardPerr(std::vector failedDestin NS_LOG_FUNCTION_NOARGS (); Ptr packet = Create (); IePerr perr; - for(std::vector::const_iterator i = failedDestinations.begin (); i != failedDestinations.end (); i ++) + for (std::vector::const_iterator i = failedDestinations.begin (); i != failedDestinations.end (); i ++) { - if(!perr.IsFull ()) - perr.AddAddressUnit (*i); + if (!perr.IsFull ()) + { + perr.AddAddressUnit (*i); + } else + { + packet->AddHeader (perr); + perr.ResetPerr (); + } + } + if (perr.GetNumOfDest () > 0) { packet->AddHeader (perr); - perr.ResetPerr (); } - } - if(perr.GetNumOfDest () > 0) - packet->AddHeader (perr); packet->AddHeader (GetWifiMeshActionHeader ()); //create 802.11 header: WifiMacHeader hdr; @@ -302,7 +333,7 @@ HwmpProtocolMac::ForwardPerr(std::vector failedDestin receivers.push_back (Mac48Address::GetBroadcast ()); } //Send Management frame - for(std::vector::const_iterator i = m_myPerr.receivers.begin (); i != m_myPerr.receivers.end (); i ++) + for (std::vector::const_iterator i = m_myPerr.receivers.begin (); i != m_myPerr.receivers.end (); i ++) { hdr.SetAddr1 (*i); m_stats.txPerr ++; @@ -316,42 +347,52 @@ HwmpProtocolMac::InitiatePerr (std::vector failedDest { //All duplicates in PERR are checked here, and there is no reason to //check it at any athoer place - { - std::vector::const_iterator end = receivers.end(); - for(std::vector::const_iterator i = receivers.begin (); i != end; i ++) +{ + std::vector::const_iterator end = receivers.end(); + for(std::vector::const_iterator i = receivers.begin (); i != end; i ++) { bool should_add = true; for (std::vector::const_iterator j = m_myPerr.receivers.begin (); j != m_myPerr.receivers.end (); j ++) + { if ((*i) == (*j)) + { should_add = false; + } + } if (should_add) + { m_myPerr.receivers.push_back(*i); + } } - } - { - std::vector::const_iterator end = failedDestinations.end (); - for(std::vector::const_iterator i = failedDestinations.begin (); i != end; i ++) +} +{ + std::vector::const_iterator end = failedDestinations.end (); + for(std::vector::const_iterator i = failedDestinations.begin (); i != end; i ++) { bool should_add = true; - for - ( - std::vector::const_iterator j = m_myPerr.destinations.begin (); - j != m_myPerr.destinations.end (); - j ++) - if ( ((*i).destination == (*j).destination) && ((*j).seqnum > (*i).seqnum) ) - should_add = false; + for (std::vector::const_iterator j = m_myPerr.destinations.begin (); j != m_myPerr.destinations.end (); j ++) + { + if ( ((*i).destination == (*j).destination) && ((*j).seqnum > (*i).seqnum) ) + { + should_add = false; + } + } if (should_add) - m_myPerr.destinations.push_back(*i); + { + m_myPerr.destinations.push_back(*i); + } } - } +} SendMyPerr (); } void HwmpProtocolMac::SendMyPerr() { NS_LOG_FUNCTION_NOARGS (); - if(m_perrTimer.IsRunning ()) - return; + if (m_perrTimer.IsRunning ()) + { + return; + } m_perrTimer = Simulator::Schedule (m_protocol->GetPerrMinInterval (), &HwmpProtocolMac::SendMyPerr, this); ForwardPerr (m_myPerr.destinations, m_myPerr.receivers); m_myPerr.destinations.clear (); @@ -360,7 +401,7 @@ HwmpProtocolMac::SendMyPerr() uint32_t HwmpProtocolMac::GetLinkMetric(Mac48Address peerAddress) const { - return m_parent->GetLinkMetric(peerAddress); + return m_parent->GetLinkMetric (peerAddress); } uint16_t HwmpProtocolMac::GetChannelId () const diff --git a/src/devices/mesh/dot11s/ie-dot11s-rann.cc b/src/devices/mesh/dot11s/ie-dot11s-rann.cc index 0eb415679..ea3e805c0 100644 --- a/src/devices/mesh/dot11s/ie-dot11s-rann.cc +++ b/src/devices/mesh/dot11s/ie-dot11s-rann.cc @@ -41,6 +41,12 @@ IeRann::IeRann (): m_metric (0) { } +WifiElementId +IeRann::ElementId () const +{ + return IE11S_RANN; +} + void IeRann::SetFlags (uint8_t flags) { diff --git a/src/devices/mesh/dot11s/ie-dot11s-rann.h b/src/devices/mesh/dot11s/ie-dot11s-rann.h index 042f620ae..1ccc63391 100644 --- a/src/devices/mesh/dot11s/ie-dot11s-rann.h +++ b/src/devices/mesh/dot11s/ie-dot11s-rann.h @@ -52,9 +52,7 @@ public: void IncrementMetric (uint32_t metric); private: - WifiElementId ElementId () const{ - return IE11S_RANN; - } + WifiElementId ElementId () const; void SerializeInformation (Buffer::Iterator i) const; uint8_t DeserializeInformation (Buffer::Iterator start, uint8_t length); uint8_t GetInformationSize () const; diff --git a/src/devices/mesh/dot11s/peer-link.cc b/src/devices/mesh/dot11s/peer-link.cc index 9850aa9dd..c78c77a31 100644 --- a/src/devices/mesh/dot11s/peer-link.cc +++ b/src/devices/mesh/dot11s/peer-link.cc @@ -184,53 +184,79 @@ void PeerLink::Close (uint16_t localLinkId, uint16_t peerLinkId, PmpReasonCode reason) { if (peerLinkId != 0 && m_localLinkId != peerLinkId) - return; + { + return; + } if (m_peerLinkId == 0) - m_peerLinkId = localLinkId; - else if (m_peerLinkId != localLinkId) - return; + { + m_peerLinkId = localLinkId; + } + else + { + if (m_peerLinkId != localLinkId) + { + return; + } + } StateMachine (CLS_ACPT, reason); } void PeerLink::OpenAccept (uint16_t localLinkId, IeConfiguration conf, Mac48Address peerMp) { if (m_peerLinkId == 0) - m_peerLinkId = localLinkId; + { + m_peerLinkId = localLinkId; + } m_configuration = conf; - if(m_peerMeshPointAddress != Mac48Address::GetBroadcast ()) - { - NS_ASSERT(m_peerMeshPointAddress == peerMp); - } + if (m_peerMeshPointAddress != Mac48Address::GetBroadcast ()) + { + NS_ASSERT(m_peerMeshPointAddress == peerMp); + } else - m_peerMeshPointAddress = peerMp; + { + m_peerMeshPointAddress = peerMp; + } StateMachine (OPN_ACPT); } void PeerLink::OpenReject (uint16_t localLinkId, IeConfiguration conf, Mac48Address peerMp, PmpReasonCode reason) { if ( m_peerLinkId == 0) - m_peerLinkId = localLinkId; + { + m_peerLinkId = localLinkId; + } m_configuration = conf; - if(m_peerMeshPointAddress != Mac48Address::GetBroadcast ()) - { - NS_ASSERT(m_peerMeshPointAddress == peerMp); - } + if (m_peerMeshPointAddress != Mac48Address::GetBroadcast ()) + { + NS_ASSERT(m_peerMeshPointAddress == peerMp); + } else - m_peerMeshPointAddress = peerMp; + { + m_peerMeshPointAddress = peerMp; + } StateMachine (OPN_RJCT, reason); } void PeerLink::ConfirmAccept (uint16_t localLinkId, uint16_t peerLinkId, uint16_t peerAid, IeConfiguration conf, Mac48Address peerMp) { if ( m_localLinkId != peerLinkId) - return; + { + return; + } if ( m_peerLinkId == 0) - m_peerLinkId = localLinkId; - else if ( m_peerLinkId != localLinkId ) - return; + { + m_peerLinkId = localLinkId; + } + else + { + if ( m_peerLinkId != localLinkId ) + { + return; + } + } m_configuration = conf; m_peerAssocId = peerAid; - if(m_peerMeshPointAddress != Mac48Address::GetBroadcast ()) + if (m_peerMeshPointAddress != Mac48Address::GetBroadcast ()) { NS_ASSERT(m_peerMeshPointAddress == peerMp); } @@ -243,13 +269,22 @@ PeerLink::ConfirmReject (uint16_t localLinkId, uint16_t peerLinkId, IeConfiguration conf, Mac48Address peerMp, PmpReasonCode reason) { if (m_localLinkId != peerLinkId) - return; + { + return; + } if (m_peerLinkId == 0) - m_peerLinkId = localLinkId; - else if (m_peerLinkId != localLinkId) - return; + { + m_peerLinkId = localLinkId; + } + else + { + if (m_peerLinkId != localLinkId) + { + return; + } + } m_configuration = conf; - if(m_peerMeshPointAddress != Mac48Address::GetBroadcast ()) + if (m_peerMeshPointAddress != Mac48Address::GetBroadcast ()) { NS_ASSERT(m_peerMeshPointAddress == peerMp); } @@ -421,7 +456,7 @@ PeerLink::StateMachine (PeerEvent event,PmpReasonCode reasoncode) m_state = ESTAB; m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, OPN_RCVD, ESTAB); ClearRetryTimer (); - NS_ASSERT(m_peerMeshPointAddress != Mac48Address::GetBroadcast ()); + NS_ASSERT (m_peerMeshPointAddress != Mac48Address::GetBroadcast ()); break; case CLS_ACPT: m_state = HOLDING; @@ -578,14 +613,18 @@ void PeerLink::RetryTimeout () { if ( m_retryCounter < m_dot11MeshMaxRetries) - StateMachine (TOR1); + { + StateMachine (TOR1); + } else - StateMachine (TOR2); + { + StateMachine (TOR2); + } } void PeerLink::SetConfirmTimer () { - NS_ASSERT(m_dot11MeshConfirmTimeout.GetMicroSeconds() !=0); + NS_ASSERT (m_dot11MeshConfirmTimeout.GetMicroSeconds() !=0); m_confirmTimer = Simulator::Schedule (m_dot11MeshConfirmTimeout, &PeerLink::ConfirmTimeout, this); } void @@ -596,8 +635,10 @@ PeerLink::ConfirmTimeout () void PeerLink::Report (std::ostream & os) const { - if(m_state != ESTAB) + if (m_state != ESTAB) + { return; + } os << "GetAddress () << "\"\n" "peerInterfaceAddress=\"" << m_peerAddress << "\"\n" diff --git a/src/devices/mesh/dot11s/peer-management-protocol-mac.cc b/src/devices/mesh/dot11s/peer-management-protocol-mac.cc index a76c2e842..d1d92301b 100644 --- a/src/devices/mesh/dot11s/peer-management-protocol-mac.cc +++ b/src/devices/mesh/dot11s/peer-management-protocol-mac.cc @@ -64,8 +64,10 @@ PeerManagementProtocolMac::Receive (Ptr const_packet, const WifiMacHeade (beaconTiming.FindFirst(myBeacon)) && (m_protocol->GetMeshId ()->IsEqual(meshId)) ) - meshBeacon = true; - m_protocol->UpdatePeerBeaconTiming( + { + meshBeacon = true; + } + m_protocol->UpdatePeerBeaconTiming ( m_ifIndex, meshBeacon, beaconTiming, @@ -76,7 +78,7 @@ PeerManagementProtocolMac::Receive (Ptr const_packet, const WifiMacHeade // Beacon shall not be dropeed. May be needed to another plugins return true; } - if(header.IsAction()) + if (header.IsAction ()) { WifiMeshActionHeader actionHdr; packet->RemoveHeader (actionHdr); @@ -91,14 +93,14 @@ PeerManagementProtocolMac::Receive (Ptr const_packet, const WifiMacHeade PeerLinkFrameStart::PlinkFrameStartFields fields; { PeerLinkFrameStart peerFrame; - peerFrame.SetPlinkFrameSubtype((uint8_t)actionValue.peerLink); + peerFrame.SetPlinkFrameSubtype ((uint8_t) actionValue.peerLink); packet->RemoveHeader (peerFrame); - fields = peerFrame.GetFields(); - NS_ASSERT(fields.subtype == actionValue.peerLink); + fields = peerFrame.GetFields (); + NS_ASSERT (fields.subtype == actionValue.peerLink); } if ( (actionValue.peerLink != WifiMeshActionHeader::PEER_LINK_CLOSE) && - !(m_parent->CheckSupportedRates(fields.rates)) + !(m_parent->CheckSupportedRates (fields.rates)) ) { m_protocol->ConfigurationMismatch (m_ifIndex, peerAddress); @@ -108,7 +110,7 @@ PeerManagementProtocolMac::Receive (Ptr const_packet, const WifiMacHeade } if ( (actionValue.peerLink != WifiMeshActionHeader::PEER_LINK_CONFIRM) && - !fields.meshId.IsEqual(*(m_protocol->GetMeshId())) + !fields.meshId.IsEqual (*(m_protocol->GetMeshId ())) ) { m_protocol->ConfigurationMismatch (m_ifIndex, peerAddress); @@ -117,34 +119,34 @@ PeerManagementProtocolMac::Receive (Ptr const_packet, const WifiMacHeade return false; } IePeerManagement peerElement; - packet->RemoveHeader(peerElement); + packet->RemoveHeader (peerElement); //Check taht frame subtype corresponds peer link subtype - if(peerElement.SubtypeIsOpen ()) + if (peerElement.SubtypeIsOpen ()) { m_stats.rxOpen ++; - NS_ASSERT(actionValue.peerLink == WifiMeshActionHeader::PEER_LINK_OPEN); + NS_ASSERT (actionValue.peerLink == WifiMeshActionHeader::PEER_LINK_OPEN); } - if(peerElement.SubtypeIsConfirm ()) + if (peerElement.SubtypeIsConfirm ()) { m_stats.rxConfirm ++; - NS_ASSERT(actionValue.peerLink == WifiMeshActionHeader::PEER_LINK_CONFIRM); + NS_ASSERT (actionValue.peerLink == WifiMeshActionHeader::PEER_LINK_CONFIRM); } - if(peerElement.SubtypeIsClose ()) + if (peerElement.SubtypeIsClose ()) { m_stats.rxClose ++; - NS_ASSERT(actionValue.peerLink == WifiMeshActionHeader::PEER_LINK_CLOSE); + NS_ASSERT (actionValue.peerLink == WifiMeshActionHeader::PEER_LINK_CLOSE); } //Deliver Peer link management frame to protocol: - m_protocol->ReceivePeerLinkFrame(m_ifIndex, peerAddress, peerMpAddress, fields.aid, peerElement, fields.config); + m_protocol->ReceivePeerLinkFrame (m_ifIndex, peerAddress, peerMpAddress, fields.aid, peerElement, fields.config); // if we can handle a frame - drop it return false; } - return m_protocol->IsActiveLink(m_ifIndex,header.GetAddr2()); + return m_protocol->IsActiveLink (m_ifIndex,header.GetAddr2()); } bool PeerManagementProtocolMac::UpdateOutcomingFrame (Ptr packet, WifiMacHeader & header, Mac48Address from, Mac48Address to) { - if(header.IsAction ()) + if (header.IsAction ()) { WifiMeshActionHeader actionHdr; packet->PeekHeader (actionHdr); @@ -152,12 +154,16 @@ PeerManagementProtocolMac::UpdateOutcomingFrame (Ptr packet, WifiMacHead if(actionHdr.GetCategory () == WifiMeshActionHeader::MESH_PEERING_MGT) return true; } - if(header.GetAddr1 ().IsGroup ()) + if (header.GetAddr1 ().IsGroup ()) + { return true; + } else { - if(m_protocol->IsActiveLink(m_ifIndex,header.GetAddr1())) + if (m_protocol->IsActiveLink (m_ifIndex,header.GetAddr1())) + { return true; + } else { m_stats.dropped ++; @@ -168,13 +174,13 @@ PeerManagementProtocolMac::UpdateOutcomingFrame (Ptr packet, WifiMacHead void PeerManagementProtocolMac::UpdateBeacon (MeshWifiBeacon & beacon) const { - Ptr beaconTiming = m_protocol->GetBeaconTimingElement(m_ifIndex); - beacon.AddInformationElement(beaconTiming); - beacon.AddInformationElement(m_protocol->GetMeshId ()); + Ptr beaconTiming = m_protocol->GetBeaconTimingElement (m_ifIndex); + beacon.AddInformationElement (beaconTiming); + beacon.AddInformationElement (m_protocol->GetMeshId ()); } void -PeerManagementProtocolMac::SendPeerLinkManagementFrame( +PeerManagementProtocolMac::SendPeerLinkManagementFrame ( Mac48Address peerAddress, Mac48Address peerMpAddress, uint16_t aid, @@ -221,7 +227,7 @@ PeerManagementProtocolMac::SendPeerLinkManagementFrame( fields.reasonCode = peerElement.GetReasonCode (); actionHdr.SetAction (WifiMeshActionHeader::MESH_PEERING_MGT, action); } - plinkFrame.SetPlinkFrameStart(fields); + plinkFrame.SetPlinkFrameStart (fields); packet->AddHeader (plinkFrame); packet->AddHeader (actionHdr); m_stats.txMgt ++; @@ -235,15 +241,20 @@ PeerManagementProtocolMac::SendPeerLinkManagementFrame( hdr.SetAddr3 (m_protocol->GetAddress ()); hdr.SetDsNotFrom (); hdr.SetDsNotTo (); - m_parent->SendManagementFrame(packet, hdr); + m_parent->SendManagementFrame (packet, hdr); } Mac48Address PeerManagementProtocolMac::GetAddress () const { - if(m_parent != 0) - return m_parent->GetAddress (); - else return Mac48Address::Mac48Address(); + if (m_parent != 0) + { + return m_parent->GetAddress (); + } + else + { + return Mac48Address::Mac48Address (); + } } std::pair PeerManagementProtocolMac::GetBeaconInfo() const @@ -256,8 +267,10 @@ PeerManagementProtocolMac::GetBeaconInfo() const void PeerManagementProtocolMac::SetBeaconShift(Time shift) { - if(shift != Seconds (0)) - m_stats.beaconShift ++; + if (shift != Seconds (0)) + { + m_stats.beaconShift ++; + } m_parent->ShiftTbtt (shift); } PeerManagementProtocolMac::Statistics::Statistics () : diff --git a/src/devices/mesh/dot11s/peer-management-protocol.cc b/src/devices/mesh/dot11s/peer-management-protocol.cc index 52b495bb3..1738924c0 100644 --- a/src/devices/mesh/dot11s/peer-management-protocol.cc +++ b/src/devices/mesh/dot11s/peer-management-protocol.cc @@ -56,14 +56,21 @@ PeerManagementProtocol::GetTypeId (void) UintegerValue (32), MakeUintegerAccessor (&PeerManagementProtocol::m_maxNumberOfPeerLinks), MakeUintegerChecker () - ); + ) + .AddAttribute ("MaxBeaconLossForBeaconTiming", + "If maximum number of beacons were lost, station will not included in beacon timing element", + UintegerValue (3), + MakeUintegerAccessor (&PeerManagementProtocol::m_maxBeaconLostForBeaconTiming), + MakeUintegerChecker () + ) + ; return tid; } PeerManagementProtocol::PeerManagementProtocol (): m_lastAssocId (0), - m_lastLocalLinkId (1) - { - } + m_lastLocalLinkId (1), + m_maxBeaconLostForBeaconTiming (3) +{} PeerManagementProtocol::~PeerManagementProtocol () { } @@ -75,12 +82,14 @@ PeerManagementProtocol::DoDispose () for (PeerLinksMap::iterator j = m_peerLinks.begin (); j != m_peerLinks.end (); j++) { for (PeerLinksOnInterface::iterator i = j->second.begin (); i != j->second.end(); i++) - (*i) = 0; + { + (*i) = 0; + } j->second.clear (); } m_peerLinks.clear (); //cleaning beacon structures: - for(BeaconInfoMap::iterator i = m_neighbourBeacons.begin(); i != m_neighbourBeacons.end(); i ++) + for (BeaconInfoMap::iterator i = m_neighbourBeacons.begin (); i != m_neighbourBeacons.end (); i ++) { i->second.clear(); } @@ -88,74 +97,77 @@ PeerManagementProtocol::DoDispose () } bool -PeerManagementProtocol::Install(Ptr mp) +PeerManagementProtocol::Install (Ptr mp) { std::vector > interfaces = mp->GetInterfaces (); - for(std::vector >::iterator i = interfaces.begin(); i != interfaces.end(); i ++) + for (std::vector >::iterator i = interfaces.begin (); i != interfaces.end (); i ++) { Ptr wifiNetDev = (*i)->GetObject (); if (wifiNetDev == 0) - return false; + { + return false; + } Ptr mac = wifiNetDev->GetMac ()->GetObject (); if (mac == 0) - return false; + { + return false; + } Ptr plugin = Create ((*i)->GetIfIndex(), this); - mac->InstallPlugin(plugin); - m_plugins[(*i)->GetIfIndex()] = plugin; + mac->InstallPlugin (plugin); + m_plugins[(*i)->GetIfIndex ()] = plugin; PeerLinksOnInterface newmap; - m_peerLinks[(*i)->GetIfIndex()] = newmap; + m_peerLinks[(*i)->GetIfIndex ()] = newmap; } // Mesh point aggregates all installed protocols - m_address = Mac48Address::ConvertFrom(mp->GetAddress ()); - mp->AggregateObject(this); + m_address = Mac48Address::ConvertFrom (mp->GetAddress ()); + mp->AggregateObject (this); return true; } Ptr -PeerManagementProtocol::GetBeaconTimingElement(uint32_t interface) +PeerManagementProtocol::GetBeaconTimingElement (uint32_t interface) { Ptr retval = Create (); - BeaconInfoMap::iterator i = m_neighbourBeacons.find(interface); - if(i == m_neighbourBeacons.end()) - return retval; - bool cleaned = false; - while(!cleaned) + BeaconInfoMap::iterator i = m_neighbourBeacons.find (interface); + if (i == m_neighbourBeacons.end ()) { - for(BeaconsOnInterface::iterator j = i->second.begin(); j != i->second.end(); j++) + return retval; + } + bool cleaned = false; + while (!cleaned) + { + for (BeaconsOnInterface::iterator j = i->second.begin (); j != i->second.end (); j++) { //check beacon loss and make a timing element - //if last beacon was 3 beacons ago - we do not put it to the + //if last beacon was m_maxBeaconLostForBeaconTiming beacons ago - we do not put it to the //timing element - if( - (j->second.referenceTbtt.GetMicroSeconds() + - (j->second.beaconInterval.GetMicroSeconds()* 3)) - < - Simulator::Now().GetMicroSeconds() - ) + if ((j->second.referenceTbtt + j->second.beaconInterval * Scalar (m_maxBeaconLostForBeaconTiming)) < Simulator::Now ()) { - i->second.erase(j); + i->second.erase (j); break; } } cleaned = true; } - for(BeaconsOnInterface::const_iterator j = i->second.begin(); j != i->second.end(); j++) - retval->AddNeighboursTimingElementUnit(j->second.aid, j->second.referenceTbtt, j->second.beaconInterval); + for (BeaconsOnInterface::const_iterator j = i->second.begin (); j != i->second.end (); j++) + { + retval->AddNeighboursTimingElementUnit (j->second.aid, j->second.referenceTbtt, j->second.beaconInterval); + } return retval; } void -PeerManagementProtocol::FillBeaconInfo(uint32_t interface, Mac48Address peerAddress, Time receivingTime, Time beaconInterval) +PeerManagementProtocol::FillBeaconInfo (uint32_t interface, Mac48Address peerAddress, Time receivingTime, Time beaconInterval) { - BeaconInfoMap::iterator i = m_neighbourBeacons.find(interface); - if(i == m_neighbourBeacons.end()) + BeaconInfoMap::iterator i = m_neighbourBeacons.find (interface); + if (i == m_neighbourBeacons.end ()) { BeaconsOnInterface newMap; m_neighbourBeacons[interface] = newMap; } - i = m_neighbourBeacons.find(interface); - BeaconsOnInterface::iterator j = i->second.find(peerAddress); - if(j == i->second.end()) + i = m_neighbourBeacons.find (interface); + BeaconsOnInterface::iterator j = i->second.find (peerAddress); + if (j == i->second.end ()) { BeaconInfo newInfo; newInfo.referenceTbtt = receivingTime; @@ -173,7 +185,7 @@ PeerManagementProtocol::FillBeaconInfo(uint32_t interface, Mac48Address peerAddr } void -PeerManagementProtocol::UpdatePeerBeaconTiming( +PeerManagementProtocol::UpdatePeerBeaconTiming ( uint32_t interface, bool meshBeacon, IeBeaconTiming timingElement, @@ -181,33 +193,43 @@ PeerManagementProtocol::UpdatePeerBeaconTiming( Time receivingTime, Time beaconInterval) { - FillBeaconInfo(interface, peerAddress, receivingTime, beaconInterval); - if(!meshBeacon) - return; + FillBeaconInfo (interface, peerAddress, receivingTime, beaconInterval); + if (!meshBeacon) + { + return; + } //BCA: PeerManagementProtocolMacMap::iterator plugin = m_plugins.find (interface); - NS_ASSERT(plugin != m_plugins.end ()); - Time shift = GetNextBeaconShift(interface); - if(TimeToTu (shift) != 0) - plugin->second->SetBeaconShift(shift); + NS_ASSERT (plugin != m_plugins.end ()); + Time shift = GetNextBeaconShift (interface); + if (TimeToTu (shift) != 0) + { + plugin->second->SetBeaconShift(shift); + } //PM STATE Machine //Check that a given beacon is not from our interface - for(PeerManagementProtocolMacMap::const_iterator i = m_plugins.begin (); i != m_plugins.end (); i ++) - if(i->second->GetAddress () == peerAddress) - return; - Ptr peerLink = FindPeerLink(interface, peerAddress); - if(peerLink !=0) + for (PeerManagementProtocolMacMap::const_iterator i = m_plugins.begin (); i != m_plugins.end (); i ++) + { + if (i->second->GetAddress () == peerAddress) + { + return; + } + } + Ptr peerLink = FindPeerLink (interface, peerAddress); + if (peerLink !=0) { peerLink->SetBeaconTimingElement (timingElement); peerLink->SetBeaconInformation (receivingTime, beaconInterval); } else + { if (ShouldSendOpen (interface, peerAddress)) { peerLink = InitiateLink (interface, peerAddress, Mac48Address::GetBroadcast (), receivingTime, beaconInterval); peerLink->SetBeaconTimingElement (timingElement); peerLink->MLMEActivePeerLinkOpen (); } + } } void @@ -226,35 +248,48 @@ PeerManagementProtocol::ReceivePeerLinkFrame ( PmpReasonCode reasonCode; bool reject = ! (ShouldAcceptOpen (interface, peerAddress,reasonCode)); if (peerLink == 0) - peerLink = InitiateLink (interface, peerAddress, peerMeshPointAddress, Simulator::Now (), Seconds(1.0)); - if(!reject) - peerLink->OpenAccept (peerManagementElement.GetLocalLinkId(), meshConfig, peerMeshPointAddress); + { + peerLink = InitiateLink (interface, peerAddress, peerMeshPointAddress, Simulator::Now (), Seconds(1.0)); + } + if (!reject) + { + peerLink->OpenAccept (peerManagementElement.GetLocalLinkId(), meshConfig, peerMeshPointAddress); + } else - peerLink->OpenReject (peerManagementElement.GetLocalLinkId(), meshConfig, peerMeshPointAddress, reasonCode); + { + peerLink->OpenReject (peerManagementElement.GetLocalLinkId(), meshConfig, peerMeshPointAddress, reasonCode); + } } if (peerLink == 0) - return; + { + return; + } if (peerManagementElement.SubtypeIsConfirm ()) - peerLink->ConfirmAccept ( - peerManagementElement.GetLocalLinkId(), - peerManagementElement.GetPeerLinkId(), - aid, - meshConfig, - peerMeshPointAddress); + { + peerLink->ConfirmAccept ( + peerManagementElement.GetLocalLinkId(), + peerManagementElement.GetPeerLinkId(), + aid, + meshConfig, + peerMeshPointAddress); + } if (peerManagementElement.SubtypeIsClose ()) - peerLink->Close ( - peerManagementElement.GetLocalLinkId(), - peerManagementElement.GetPeerLinkId(), - peerManagementElement.GetReasonCode() - ); + { + peerLink->Close ( + peerManagementElement.GetLocalLinkId(), + peerManagementElement.GetPeerLinkId(), + peerManagementElement.GetReasonCode() + ); + } } - void PeerManagementProtocol::ConfigurationMismatch (uint32_t interface, Mac48Address peerAddress) { - Ptr peerLink = FindPeerLink(interface, peerAddress); - if(peerLink != 0) - peerLink->MLMECancelPeerLink (REASON11S_MESH_CAPABILITY_POLICY_VIOLATION); + Ptr peerLink = FindPeerLink (interface, peerAddress); + if (peerLink != 0) + { + peerLink->MLMECancelPeerLink (REASON11S_MESH_CAPABILITY_POLICY_VIOLATION); + } } Ptr @@ -267,18 +302,24 @@ PeerManagementProtocol::InitiateLink ( { Ptr new_link = CreateObject (); if (m_lastLocalLinkId == 0xff) - m_lastLocalLinkId = 0; + { + m_lastLocalLinkId = 0; + } //find a beacon entry BeaconInfoMap::iterator beaconsOnInterface = m_neighbourBeacons.find (interface); - if(beaconsOnInterface == m_neighbourBeacons.end()) - FillBeaconInfo(interface, peerAddress, lastBeacon, beaconInterval); + if (beaconsOnInterface == m_neighbourBeacons.end()) + { + FillBeaconInfo(interface, peerAddress, lastBeacon, beaconInterval); + } beaconsOnInterface = m_neighbourBeacons.find (interface); BeaconsOnInterface::iterator beacon = beaconsOnInterface->second.find (peerAddress); - if(beacon == beaconsOnInterface->second.end ()) - FillBeaconInfo(interface, peerAddress, lastBeacon, beaconInterval); + if (beacon == beaconsOnInterface->second.end ()) + { + FillBeaconInfo(interface, peerAddress, lastBeacon, beaconInterval); + } beacon = beaconsOnInterface->second.find (peerAddress); //find a peer link - it must not exist - if(FindPeerLink(interface, peerAddress) != 0) + if (FindPeerLink(interface, peerAddress) != 0) { NS_FATAL_ERROR ("Peer link must not exist."); } @@ -304,6 +345,7 @@ PeerManagementProtocol::FindPeerLink(uint32_t interface, Mac48Address peerAddres PeerLinksMap::iterator iface = m_peerLinks.find (interface); NS_ASSERT (iface != m_peerLinks.end()); for (PeerLinksOnInterface::iterator i = iface->second.begin (); i != iface->second.end(); i++) + { if ((*i)->GetPeerAddress () == peerAddress) { if((*i)->LinkIsIdle ()) @@ -313,8 +355,11 @@ PeerManagementProtocol::FindPeerLink(uint32_t interface, Mac48Address peerAddres return 0; } else + { return (*i); + } } + } return 0; } void @@ -323,22 +368,28 @@ PeerManagementProtocol::SetPeerLinkStatusCallback(Callback -PeerManagementProtocol::GetActiveLinks(uint32_t interface) +PeerManagementProtocol::GetActiveLinks (uint32_t interface) { std::vector retval; PeerLinksMap::iterator iface = m_peerLinks.find (interface); NS_ASSERT (iface != m_peerLinks.end()); for (PeerLinksOnInterface::iterator i = iface->second.begin (); i != iface->second.end(); i++) - if((*i)->LinkIsEstab ()) + { + if ((*i)->LinkIsEstab ()) + { retval.push_back((*i)->GetPeerAddress ()); + } + } return retval; } bool PeerManagementProtocol::IsActiveLink (uint32_t interface, Mac48Address peerAddress) { Ptr peerLink = FindPeerLink(interface, peerAddress); - if(peerLink != 0) - return (peerLink->LinkIsEstab ()); + if (peerLink != 0) + { + return (peerLink->LinkIsEstab ()); + } return false; } bool @@ -373,16 +424,20 @@ PeerManagementProtocol::GetNextBeaconShift (uint32_t interface) PeerManagementProtocolMacMap::iterator plugin = m_plugins.find (interface); NS_ASSERT (plugin != m_plugins.end()); std::pair myBeacon = plugin->second->GetBeaconInfo (); - if(Simulator::Now () + TuToTime (maxShift) > myBeacon.first + myBeacon.second) - return MicroSeconds (0); + if (Simulator::Now () + TuToTime (maxShift) > myBeacon.first + myBeacon.second) + { + return MicroSeconds (0); + } for (PeerLinksOnInterface::iterator i = iface->second.begin (); i != iface->second.end (); i++) { IeBeaconTiming::NeighboursTimingUnitsList neighbours; - if((*i)->LinkIsIdle ()) - continue; + if ((*i)->LinkIsIdle ()) + { + continue; + } neighbours = (*i)->GetBeaconTimingElement ().GetNeighboursTimingElementsList(); //Going through all my timing elements and detecting future beacon collisions - for (IeBeaconTiming::NeighboursTimingUnitsList::const_iterator j = neighbours.begin (); j != neighbours.end(); j++) + for (IeBeaconTiming::NeighboursTimingUnitsList::const_iterator j = neighbours.begin (); j != neighbours.end (); j++) //We apply MBAC only if beacon Intervals are equal if ((*j)->GetBeaconInterval () == TimeToTu (myBeacon.second)) { @@ -394,7 +449,7 @@ PeerManagementProtocol::GetNextBeaconShift (uint32_t interface) int beaconShift = randomShift.GetInteger (minShift,maxShift) * ((randomSign.GetValue () >= 0) ? 1 : -1); NS_LOG_DEBUG ("Apply MBCA: Shift value = " << beaconShift << " beacon TUs"); //Do not shift to the past! - return (TuToTime (beaconShift) + Simulator::Now() < myBeacon.first) ? TuToTime (beaconShift) : TuToTime (0); + return (TuToTime (beaconShift) + Simulator::Now () < myBeacon.first) ? TuToTime (beaconShift) : TuToTime (0); } } } @@ -408,33 +463,37 @@ PeerManagementProtocol::TuToTime (uint32_t x) uint32_t PeerManagementProtocol::TimeToTu (Time x) { - return (uint32_t) (x.GetMicroSeconds ()/1024); + return (uint32_t) (x.GetMicroSeconds () / 1024); } void PeerManagementProtocol::PeerLinkStatus (uint32_t interface, Mac48Address peerAddress, Mac48Address peerMeshPointAddress, PeerLink::PeerState ostate, PeerLink::PeerState nstate) { PeerManagementProtocolMacMap::iterator plugin = m_plugins.find (interface); - NS_ASSERT(plugin != m_plugins.end()); - NS_LOG_DEBUG( + NS_ASSERT (plugin != m_plugins.end()); + NS_LOG_DEBUG ( "Link between me:" << m_address << " my interface:" << plugin->second->GetAddress() << " and peer mesh point:" << peerMeshPointAddress << " and its interface:" << peerAddress << ", at my interface ID:" << interface << ". State movement:" << ostate << " -> " << nstate); - if((nstate == PeerLink::ESTAB) && (ostate != PeerLink::ESTAB)) + if ((nstate == PeerLink::ESTAB) && (ostate != PeerLink::ESTAB)) { m_stats.linksOpened ++; m_stats.linksTotal++; - if(!m_peerStatusCallback.IsNull ()) - m_peerStatusCallback (peerMeshPointAddress, peerAddress, interface, true); + if (!m_peerStatusCallback.IsNull ()) + { + m_peerStatusCallback (peerMeshPointAddress, peerAddress, interface, true); + } } - if((ostate == PeerLink::ESTAB) && (nstate != PeerLink::ESTAB)) + if ((ostate == PeerLink::ESTAB) && (nstate != PeerLink::ESTAB)) { m_stats.linksClosed ++; m_stats.linksTotal--; - if(!m_peerStatusCallback.IsNull ()) - m_peerStatusCallback (peerMeshPointAddress, peerAddress, interface, false); + if (!m_peerStatusCallback.IsNull ()) + { + m_peerStatusCallback (peerMeshPointAddress, peerAddress, interface, false); + } } if (nstate == PeerLink::IDLE) { @@ -476,7 +535,7 @@ PeerManagementProtocol::Report (std::ostream & os) const { os << "\n"; m_stats.Print (os); - for(PeerManagementProtocolMacMap::const_iterator plugins = m_plugins.begin (); plugins != m_plugins.end (); plugins ++) + for (PeerManagementProtocolMacMap::const_iterator plugins = m_plugins.begin (); plugins != m_plugins.end (); plugins ++) { //Take statistics from plugin: plugins->second->Report (os); @@ -484,7 +543,9 @@ PeerManagementProtocol::Report (std::ostream & os) const PeerLinksMap::const_iterator iface = m_peerLinks.find (plugins->second->m_ifIndex); NS_ASSERT (iface != m_peerLinks.end()); for (PeerLinksOnInterface::const_iterator i = iface->second.begin (); i != iface->second.end(); i++) - (*i)->Report (os); + { + (*i)->Report (os); + } } os << "\n"; } @@ -492,8 +553,10 @@ void PeerManagementProtocol::ResetStats () { m_stats = Statistics::Statistics (m_stats.linksTotal); // don't reset number of links - for(PeerManagementProtocolMacMap::const_iterator plugins = m_plugins.begin (); plugins != m_plugins.end (); plugins ++) - plugins->second->ResetStats (); + for (PeerManagementProtocolMacMap::const_iterator plugins = m_plugins.begin (); plugins != m_plugins.end (); plugins ++) + { + plugins->second->ResetStats (); + } } } // namespace dot11s diff --git a/src/devices/mesh/dot11s/peer-management-protocol.h b/src/devices/mesh/dot11s/peer-management-protocol.h index e29d1c432..31b716a6d 100644 --- a/src/devices/mesh/dot11s/peer-management-protocol.h +++ b/src/devices/mesh/dot11s/peer-management-protocol.h @@ -213,6 +213,7 @@ private: uint16_t m_lastAssocId; uint16_t m_lastLocalLinkId; uint8_t m_maxNumberOfPeerLinks; + uint8_t m_maxBeaconLostForBeaconTiming; /** * Peer Links * \{ diff --git a/src/devices/mesh/mesh-point-device.cc b/src/devices/mesh/mesh-point-device.cc index 97ce491ac..e38487815 100644 --- a/src/devices/mesh/mesh-point-device.cc +++ b/src/devices/mesh/mesh-point-device.cc @@ -38,14 +38,14 @@ TypeId MeshPointDevice::GetTypeId () { static TypeId tid = TypeId ("ns3::MeshPointDevice") - .SetParent () - .AddConstructor () - .AddAttribute ("RoutingProtocol", "The mesh routing protocol used by this mesh point.", - PointerValue (), - MakePointerAccessor (&MeshPointDevice::GetRoutingProtocol, - &MeshPointDevice::SetRoutingProtocol), - MakePointerChecker ()) - ; + .SetParent () + .AddConstructor () + .AddAttribute ("RoutingProtocol", "The mesh routing protocol used by this mesh point.", + PointerValue (), + MakePointerAccessor (&MeshPointDevice::GetRoutingProtocol, + &MeshPointDevice::SetRoutingProtocol), + MakePointerChecker ()) + ; return tid; } @@ -65,7 +65,9 @@ MeshPointDevice::DoDispose () { NS_LOG_FUNCTION_NOARGS (); for (std::vector< Ptr >::iterator iter = m_ifaces.begin (); iter != m_ifaces.end (); iter++) - *iter = 0; + { + *iter = 0; + } m_ifaces.clear (); m_node = 0; NetDevice::DoDispose (); @@ -87,7 +89,9 @@ MeshPointDevice::ReceiveFromDevice (Ptr incomingPort, Ptr packet_copy = packet->Copy (); @@ -323,10 +327,13 @@ MeshPointDevice::GetNInterfaces () const Ptr MeshPointDevice::GetInterface (uint32_t n) const { - for(std::vector< Ptr >::const_iterator i = m_ifaces.begin (); i != m_ifaces.end (); i ++) - if((*i)->GetIfIndex() == n) + for (std::vector< Ptr >::const_iterator i = m_ifaces.begin (); i != m_ifaces.end (); i ++) + { + if ((*i)->GetIfIndex() == n) + { return (*i); - + } + } NS_FATAL_ERROR ("Mesh point interface is not found by index"); return 0; } @@ -351,17 +358,20 @@ MeshPointDevice::AddInterface (Ptr iface) } // Mesh point has MAC address of it's first interface - if (m_ifaces.empty()) + if (m_ifaces.empty ()) + { m_address = Mac48Address::ConvertFrom (iface->GetAddress ()); - + } const WifiNetDevice * wifiNetDev = dynamic_cast (PeekPointer (iface)); if (wifiNetDev == 0) + { NS_FATAL_ERROR ("Device is not a WiFi NIC: cannot be used as a mesh point interface."); - + } MeshWifiInterfaceMac * ifaceMac = dynamic_cast (PeekPointer (wifiNetDev->GetMac ())); if (ifaceMac == 0) + { NS_FATAL_ERROR ("WiFi device doesn't have correct MAC installed: cannot be used as a mesh point interface."); - + } ifaceMac->SetMeshPointAddress (m_address); // Receive frames from this interface @@ -420,10 +430,16 @@ MeshPointDevice::DoSend (bool success, Ptr packet, Mac48Address src, Mac // Send if (outIface != 0xffffffff) + { GetInterface (outIface)->SendFrom(packet, src, dst, protocol); + } else + { for (std::vector >::iterator i = m_ifaces.begin (); i != m_ifaces.end(); i++) + { (*i) -> SendFrom (packet->Copy (), src, dst, protocol); + } + } } void diff --git a/src/devices/mesh/mesh-wifi-interface-mac.cc b/src/devices/mesh/mesh-wifi-interface-mac.cc index 01eb9b313..c10c8698a 100644 --- a/src/devices/mesh/mesh-wifi-interface-mac.cc +++ b/src/devices/mesh/mesh-wifi-interface-mac.cc @@ -190,7 +190,9 @@ MeshWifiInterfaceMac::SetWifiRemoteStationManager (Ptr NS_LOG_FUNCTION (this << stationManager); m_stationManager = stationManager; for (Queues::const_iterator i = m_queues.begin (); i != m_queues.end (); i ++) + { i->second->SetWifiRemoteStationManager (stationManager); + } m_beaconDca->SetWifiRemoteStationManager (stationManager); m_low->SetWifiRemoteStationManager (stationManager); } @@ -310,9 +312,13 @@ uint16_t MeshWifiInterfaceMac::GetFrequencyChannel () const Ptr phy = m_phy->GetObject (); if (phy != 0) - return phy->GetChannelNumber (); + { + return phy->GetChannelNumber (); + } else - return 0; + { + return 0; + } } void MeshWifiInterfaceMac::SwitchFrequencyChannel (uint16_t new_id) @@ -371,7 +377,10 @@ MeshWifiInterfaceMac::ForwardDown (Ptr const_packet, Mac48Address for (PluginList::const_iterator i = m_plugins.end()-1; i != m_plugins.begin()-1; i--) { bool drop = ! ((*i)->UpdateOutcomingFrame(packet, hdr, from, to)); - if (drop) return; // plugin drops frame + if (drop) + { + return; // plugin drops frame + } } // Assert that address1 is set. Assert will fail e.g. if there is no installed routing plugin. @@ -394,8 +403,10 @@ MeshWifiInterfaceMac::ForwardDown (Ptr const_packet, Mac48Address // Get Qos tag: AccessClass ac = AC_BE; QosTag tag; - if(packet->RemovePacketTag (tag)) - ac = QosUtilsMapTidToAc (tag.Get ()); + if (packet->RemovePacketTag (tag)) + { + ac = QosUtilsMapTidToAc (tag.Get ()); + } m_stats.sentFrames ++; m_stats.sentBytes += packet->GetSize (); NS_ASSERT(m_queues.find(ac) != m_queues.end ()); @@ -410,7 +421,10 @@ MeshWifiInterfaceMac::SendManagementFrame (Ptr packet, const WifiMacHead for (PluginList::const_iterator i = m_plugins.end()-1; i != m_plugins.begin()-1; i--) { bool drop = ! ((*i)->UpdateOutcomingFrame(packet, header, Mac48Address (), Mac48Address ())); - if (drop) return; // plugin drops frame + if (drop) + { + return; // plugin drops frame + } } m_stats.sentFrames ++; m_stats.sentBytes += packet->GetSize (); @@ -448,7 +462,9 @@ MeshWifiInterfaceMac::CheckSupportedRates(SupportedRates rates) const { WifiMode mode = m_stationManager->GetBasicMode (i); if (!rates.IsSupportedRate (mode.GetDataRate ())) - return false; + { + return false; + } } return true; } @@ -490,8 +506,10 @@ MeshWifiInterfaceMac::SetBeaconGeneration (bool enable) m_tbtt = Simulator::Now() + randomStart; } else - // stop sending beacons - m_beaconSendEvent.Cancel (); + { + // stop sending beacons + m_beaconSendEvent.Cancel (); + } } bool @@ -538,8 +556,9 @@ MeshWifiInterfaceMac::SendBeacon () // Ask all plugins to add their specific information elements to beacon for (PluginList::const_iterator i = m_plugins.begin(); i != m_plugins.end(); ++i) - (*i)->UpdateBeacon (beacon); - + { + (*i)->UpdateBeacon (beacon); + } m_beaconDca->Queue (beacon.CreatePacket(), beacon.CreateHeader(GetAddress (), GetMeshPointAddress ())); ScheduleNextBeacon (); @@ -549,8 +568,10 @@ void MeshWifiInterfaceMac::Receive (Ptr packet, WifiMacHeader const *hdr) { // Process beacon - if((hdr->GetAddr1() != GetAddress()) && (hdr->GetAddr1() != Mac48Address::GetBroadcast())) - return; + if ((hdr->GetAddr1() != GetAddress()) && (hdr->GetAddr1() != Mac48Address::GetBroadcast())) + { + return; + } if (hdr->IsBeacon ()) { m_stats.recvBeacons ++; @@ -577,7 +598,9 @@ MeshWifiInterfaceMac::Receive (Ptr packet, WifiMacHeader const *hdr) { peerSta->AddSupportedMode (mode); if (rates.IsBasicRate (mode.GetDataRate ())) - m_stationManager->AddBasicMode (mode); + { + m_stationManager->AddBasicMode (mode); + } } } } @@ -591,23 +614,32 @@ MeshWifiInterfaceMac::Receive (Ptr packet, WifiMacHeader const *hdr) for (PluginList::iterator i = m_plugins.begin (); i != m_plugins.end(); ++i) { bool drop = ! ((*i)->Receive(packet, *hdr)); - if (drop) return; // plugin drops frame + if (drop) + { + return; // plugin drops frame + } } // Check if QoS tag exists and add it: if (hdr->IsQosData ()) - packet->AddPacketTag (QosTag (hdr->GetQosTid ())); + { + packet->AddPacketTag (QosTag (hdr->GetQosTid ())); + } // Forward data up if (hdr->IsData ()) + { ForwardUp (packet, hdr->GetAddr4(), hdr->GetAddr3()); + } } uint32_t MeshWifiInterfaceMac::GetLinkMetric (Mac48Address peerAddress) { uint32_t metric = 1; - if(!m_linkMetricCallback.IsNull ()) - metric = m_linkMetricCallback(peerAddress, this); + if (!m_linkMetricCallback.IsNull ()) + { + metric = m_linkMetricCallback(peerAddress, this); + } return metric; } @@ -665,7 +697,7 @@ void MeshWifiInterfaceMac::SetQueue (Ptr queue, AccessClass ac) { Queues::iterator i = m_queues.find(ac); - if(i != m_queues.end ()) + if (i != m_queues.end ()) { NS_LOG_WARN("Queue is already set!"); return; @@ -677,7 +709,7 @@ MeshWifiInterfaceMac::SetQueue (Ptr queue, AccessClass ac) Ptr MeshWifiInterfaceMac::GetQueue (AccessClass ac) { - Queues::iterator i = m_queues.find(ac); + Queues::iterator i = m_queues.find (ac); if(i != m_queues.end ()) { NS_LOG_WARN("Queue is not found! Check access class!");