diff --git a/src/devices/mesh/dot11s/hwmp-mac-plugin.cc b/src/devices/mesh/dot11s/hwmp-mac-plugin.cc index 0baa05c5b..d83a87a80 100644 --- a/src/devices/mesh/dot11s/hwmp-mac-plugin.cc +++ b/src/devices/mesh/dot11s/hwmp-mac-plugin.cc @@ -101,7 +101,7 @@ HwmpMacPlugin::Receive (Ptr packet, const WifiMacHeader & header) if (preq.GetTtl () == 0) return false; preq.DecrementTtl (); - m_protocol->ReceivePreq (preq, header.GetAddr2 (), m_ifIndex, m_parent->GetLinkMetric(header.GetAddr2 ())); + m_protocol->ReceivePreq (preq, header.GetAddr2 (), m_ifIndex, header.GetAddr3 (), m_parent->GetLinkMetric(header.GetAddr2 ())); return false; } case WifiMeshActionHeader::PATH_REPLY: @@ -111,14 +111,14 @@ HwmpMacPlugin::Receive (Ptr packet, const WifiMacHeader & header) if(prep.GetTtl () == 0) return false; prep.DecrementTtl (); - m_protocol->ReceivePrep (prep, header.GetAddr2 (), m_ifIndex, m_parent->GetLinkMetric(header.GetAddr2 ())); + m_protocol->ReceivePrep (prep, header.GetAddr2 (), m_ifIndex, header.GetAddr3 (), m_parent->GetLinkMetric(header.GetAddr2 ())); return false; } case WifiMeshActionHeader::PATH_ERROR: { IePerr perr; packet->RemoveHeader (perr); - m_protocol->ReceivePerr (perr, header.GetAddr2 (), m_ifIndex); + m_protocol->ReceivePerr (perr, header.GetAddr2 (), m_ifIndex, header.GetAddr3 ()); return false; } case WifiMeshActionHeader::ROOT_ANNOUNCEMENT: @@ -197,7 +197,7 @@ HwmpMacPlugin::SendOnePreq () hdr.SetDsNotFrom (); hdr.SetDsNotTo (); hdr.SetAddr2 (m_parent->GetAddress ()); - hdr.SetAddr3 (Mac48Address::GetBroadcast ()); + 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 ++) @@ -234,7 +234,7 @@ HwmpMacPlugin::SendOnePerr() hdr.SetDsNotFrom (); hdr.SetDsNotTo (); hdr.SetAddr2 (m_parent->GetAddress ()); - hdr.SetAddr3 (Mac48Address::GetBroadcast ()); + hdr.SetAddr3 (m_protocol->GetAddress ()); //Send Management frame for(std::vector::const_iterator i = m_myPerr.receivers.begin (); i != m_myPerr.receivers.end (); i ++) { @@ -263,7 +263,7 @@ HwmpMacPlugin::SendPrep (IePrep prep, Mac48Address receiver) hdr.SetDsNotTo (); hdr.SetAddr1 (receiver); hdr.SetAddr2 (m_parent->GetAddress ()); - hdr.SetAddr3 (prep.GetDestinationAddress ()); + hdr.SetAddr3 (m_protocol->GetAddress ()); //Send Management frame m_parent->SendManagementFrame(packet, hdr); } diff --git a/src/devices/mesh/dot11s/hwmp-protocol.cc b/src/devices/mesh/dot11s/hwmp-protocol.cc index 10f84b7ca..f80704b69 100644 --- a/src/devices/mesh/dot11s/hwmp-protocol.cc +++ b/src/devices/mesh/dot11s/hwmp-protocol.cc @@ -132,7 +132,7 @@ HwmpProtocol::GetTypeId () ) .AddAttribute ("doFlag", "Destination only HWMP flag", - BooleanValue (true), + BooleanValue (false), MakeUintegerAccessor (&HwmpProtocol::m_doFlag), MakeUintegerChecker () ) @@ -259,8 +259,8 @@ HwmpProtocol::ForwardUnicast(uint32_t sourceIface, const Mac48Address source, c Ptr packet, uint16_t protocolType, RouteReplyCallback routeReply, uint32_t ttl) { NS_ASSERT(destination != Mac48Address::GetBroadcast ()); - NS_LOG_DEBUG("Requested src = "<LookupReactive(destination); + NS_LOG_DEBUG("Requested src = "< > destinations = preq.GetDestinationList (); + //Add reactive path to originator: + if ( + ((m_rtable->LookupReactive(preq.GetOriginatorAddress ())).retransmitter == Mac48Address::GetBroadcast ()) || + ((m_rtable->LookupReactive(preq.GetOriginatorAddress ())).metric > preq.GetMetric ()) + ) + { + m_rtable->AddReactivePath ( + preq.GetOriginatorAddress (), + from, + interface, + preq.GetMetric (), + MicroSeconds (preq.GetLifetime () *1024), + preq.GetOriginatorSeqNumber () + ); + ReactivePathResolved (preq.GetOriginatorAddress ()); + } + //Add reactive path for precursor: + if ( + ((m_rtable->LookupReactive(fromMp)).retransmitter == Mac48Address::GetBroadcast ()) || + ((m_rtable->LookupReactive(fromMp)).metric > preq.GetMetric ()) + ) + { + m_rtable->AddReactivePath ( + fromMp, + from, + interface, + metric, + MicroSeconds (preq.GetLifetime () *1024), + preq.GetOriginatorSeqNumber () + ); + ReactivePathResolved (fromMp); + } for (std::vector >::const_iterator i = destinations.begin (); i != destinations.end(); i++) { if ((*i)->GetDestinationAddress () == Mac48Address::GetBroadcast()) @@ -391,6 +423,7 @@ HwmpProtocol::ReceivePreq (IePreq preq, Mac48Address from, uint32_t interface, u preq.GetLifetime (), interface ); + NS_ASSERT(m_rtable->LookupReactive (preq.GetOriginatorAddress ()).retransmitter != Mac48Address::GetBroadcast ()); preq.DelDestinationAddressElement ((*i)->GetDestinationAddress()); continue; } @@ -425,19 +458,6 @@ HwmpProtocol::ReceivePreq (IePreq preq, Mac48Address from, uint32_t interface, u } } } - if ( - ((m_rtable->LookupReactive(preq.GetOriginatorAddress ())).retransmitter == Mac48Address::GetBroadcast ()) || - ((m_rtable->LookupReactive(preq.GetOriginatorAddress ())).metric > preq.GetMetric ()) - ) - m_rtable->AddReactivePath ( - preq.GetOriginatorAddress (), - from, - interface, - preq.GetMetric (), - MicroSeconds (preq.GetLifetime () *1024), - preq.GetOriginatorSeqNumber () - ); - ReactivePathResolved (preq.GetOriginatorAddress ()); //chack if must retransmit: if (preq.GetDestCount () == 0) return; @@ -447,7 +467,7 @@ HwmpProtocol::ReceivePreq (IePreq preq, Mac48Address from, uint32_t interface, u i->second->SendPreq (preq); } void -HwmpProtocol::ReceivePrep (IePrep prep, Mac48Address from, uint32_t interface, uint32_t metric) +HwmpProtocol::ReceivePrep (IePrep prep, Mac48Address from, uint32_t interface, Mac48Address fromMp, uint32_t metric) { prep.IncrementMetric (metric); //acceptance cretirea: @@ -485,6 +505,20 @@ HwmpProtocol::ReceivePrep (IePrep prep, Mac48Address from, uint32_t interface, u m_rtable->AddPrecursor (prep.GetOriginatorAddress (), interface, result.retransmitter); ReactivePathResolved (prep.GetOriginatorAddress ()); } + if ( + ((m_rtable->LookupReactive(fromMp)).retransmitter == Mac48Address::GetBroadcast ()) || + ((m_rtable->LookupReactive(fromMp)).metric > prep.GetMetric ()) + ) + { + m_rtable->AddReactivePath ( + fromMp, + from, + interface, + metric, + MicroSeconds(prep.GetLifetime () * 1024), + prep.GetOriginatorSeqNumber ()); + ReactivePathResolved (fromMp); + } if(prep.GetDestinationAddress () == GetAddress ()) { NS_LOG_DEBUG("I am "<second->SendPrep(prep, result.retransmitter); } void -HwmpProtocol::ReceivePerr (IePerr perr, Mac48Address from, uint32_t interface) +HwmpProtocol::ReceivePerr (IePerr perr, Mac48Address from, uint32_t interface, Mac48Address fromMp) { //Acceptance cretirea: NS_LOG_DEBUG("I am "<LookupReactive (destinations[i].destination); - NS_LOG_DEBUG("Destination = "<