--- a/examples/mesh.cc Wed Apr 01 20:48:05 2009 +0400
+++ b/examples/mesh.cc Thu Apr 02 13:38:38 2009 +0400
@@ -39,8 +39,8 @@
main (int argc, char *argv[])
{
// Creating square topology with nNodes x nNodes grid
- int xSize = 6;
- int ySize = 6;
+ int xSize = 2;
+ int ySize = 2;
double step = 100.0; // Grid with one-hop edge
double randomStart = 0.1; // One beacon interval
uint32_t nIfaces = 1;
--- a/src/devices/mesh/dot11s/hwmp-mac-plugin.cc Wed Apr 01 20:48:05 2009 +0400
+++ b/src/devices/mesh/dot11s/hwmp-mac-plugin.cc Thu Apr 02 13:38:38 2009 +0400
@@ -74,7 +74,8 @@
return false;
tag.SetTtl (meshHdr.GetMeshTtl () - 1);
tag.SetAddress (header.GetAddr2 ());
- packet->AddPacketTag(tag);
+ if(!m_protocol->RemoveTags(destination))
+ packet->AddPacketTag(tag);
if (destination == Mac48Address::GetBroadcast ())
if(m_protocol->DropDataFrame (meshHdr.GetMeshSeqno (), header.GetAddr4 ()) )
return false;
@@ -140,6 +141,7 @@
meshHdr.SetMeshTtl(tag.GetTtl());
packet->AddHeader(meshHdr);
header.SetAddr1(tag.GetAddress());
+ NS_LOG_UNCOND("Broadcast sent");
return true;
}
void
--- a/src/devices/mesh/dot11s/hwmp-protocol.cc Wed Apr 01 20:48:05 2009 +0400
+++ b/src/devices/mesh/dot11s/hwmp-protocol.cc Thu Apr 02 13:38:38 2009 +0400
@@ -183,7 +183,10 @@
tag.DecrementTtl ();
}
if (destination == Mac48Address::GetBroadcast ())
+ {
+ NS_LOG_UNCOND("BROADCAS");
routeReply (true, packet, source, destination, protocolType, HwmpRtable::INTERFACE_ANY);
+ }
else
return ForwardUnicast(sourceIface, source, destination, packet, protocolType, routeReply);
return true;
@@ -248,13 +251,12 @@
return true;
}
bool
-HwmpProtocol::HandleIncomingFrame (Ptr<Packet> packet, Mac48Address src, Mac48Address dst, uint16_t protocol)
+HwmpProtocol::RemoveTags (Mac48Address dst)
{
- //Handle only incoming frames:
- NS_ASSERT(dst == m_address);
- HwmpTag tag;
- NS_ASSERT(packet->RemovePacketTag(tag));
- return true;
+ //Check that dst is my address
+ if(dst == m_address)
+ return true;
+ return false;
}
void
HwmpProtocol::ReceivePreq (IePreq preq, Mac48Address from, uint32_t interface)
@@ -493,10 +495,17 @@
return true;
}
void
-HwmpProtocol::PeerLinkStatus(Mac48Address peerAddress, uint32_t interface, bool status)
+HwmpProtocol::PeerLinkStatus(Mac48Address meshPointAddress, Mac48Address peerAddress, uint32_t interface, bool status)
{
if(status)
- m_rtable->AddReactivePath(peerAddress, peerAddress, interface, 1, Seconds (0), 0);
+ {
+ HwmpRtable::LookupResult result = m_rtable->LookupReactive(meshPointAddress);
+ if(result.retransmitter == Mac48Address::GetBroadcast ())
+ {
+ NS_LOG_UNCOND("I am"<<m_address<<" MP:"<<meshPointAddress<<"accessible through interface"<<interface<<", ra = "<<peerAddress);
+ m_rtable->AddReactivePath(meshPointAddress, peerAddress, interface, 1, Seconds (0), 0);
+ }
+ }
else
{
std::vector<IePerr::FailedDestination> destinations = m_rtable->GetUnreachableDestinations (peerAddress);
@@ -696,7 +705,10 @@
return;
}
for(HwmpPluginMap::iterator i = m_interfaces.begin (); i != m_interfaces.end (); i ++)
+ {
+ //i->second->RequestDestination(Mac48Address("00:00:00:00:00:04"));
i->second->RequestDestination(dst);
+ }
m_preqTimeouts[dst] = Simulator::Schedule (
MilliSeconds (2*(m_dot11MeshHWMPnetDiameterTraversalTime.GetMilliSeconds())),
&HwmpProtocol::RetryPathDiscovery, this, dst, numOfRetry);
--- a/src/devices/mesh/dot11s/hwmp-protocol.h Wed Apr 01 20:48:05 2009 +0400
+++ b/src/devices/mesh/dot11s/hwmp-protocol.h Thu Apr 02 13:38:38 2009 +0400
@@ -54,7 +54,6 @@
/// Route request, inherited from MeshL2RoutingProtocol
bool RequestRoute (uint32_t sourceIface, const Mac48Address source, const Mac48Address destination,
Ptr<Packet> packet, uint16_t protocolType, RouteReplyCallback routeReply);
- bool HandleIncomingFrame (Ptr<Packet> packet, Mac48Address src, Mac48Address dst, uint16_t protocol);
/**
* \brief Install HWMP on given mesh point.
*
@@ -64,7 +63,7 @@
* via MeshPointDevice::GetObject<dot11s::HwmpProtocol>();
*/
bool Install (Ptr<MeshPointDevice>);
- void PeerLinkStatus(Mac48Address peerAddress, uint32_t interface,bool status);
+ void PeerLinkStatus(Mac48Address meshPontAddress, Mac48Address peerAddress, uint32_t interface,bool status);
///\brief This callback is used to obtain active neighbours on a
//given interface
///\param interface is the interface ID
@@ -108,7 +107,8 @@
*/
bool DropDataFrame(uint32_t, Mac48Address);
//\}
-
+ ///\brief if the packet is ours - plugins should remove tag
+ bool RemoveTags (Mac48Address dst);
private:
///\name Methods related to Queue/Dequeue procedures
//\{
--- a/src/devices/mesh/dot11s/peer-link.cc Wed Apr 01 20:48:05 2009 +0400
+++ b/src/devices/mesh/dot11s/peer-link.cc Thu Apr 02 13:38:38 2009 +0400
@@ -70,19 +70,24 @@
// PeerLink public interface
//-----------------------------------------------------------------------------
PeerLink::PeerLink ():
- m_localLinkId (0),
- m_peerLinkId (0),
- m_state (IDLE),
- m_retryCounter (0)
+ m_peerAddress (Mac48Address::GetBroadcast ()),
+ m_peerMeshPointAddress (Mac48Address::GetBroadcast ()),
+ m_localLinkId (0),
+ m_peerLinkId (0),
+ m_state (IDLE),
+ m_retryCounter (0)
{
}
-
void
PeerLink::SetPeerAddress (Mac48Address macaddr)
{
m_peerAddress = macaddr;
}
-
+void
+PeerLink::SetPeerMeshPointAddress(Mac48Address macaddr)
+{
+ m_peerMeshPointAddress = macaddr;
+}
void
PeerLink::SetInterface (uint32_t interface)
{
@@ -93,13 +98,11 @@
{
m_localLinkId = id;
}
-
void
PeerLink::SetLocalAid (uint16_t aid)
{
m_assocId = aid;
}
-
void
PeerLink::SetBeaconInformation (Time lastBeacon, Time beaconInterval)
{
@@ -110,82 +113,73 @@
NS_ASSERT (delay.GetMicroSeconds() != 0);
m_beaconLossTimer = Simulator::Schedule (delay, &PeerLink::BeaconLoss, this);
}
-
void
PeerLink::MLMESetSignalStatusCallback (PeerLink::SignalStatusCallback cb)
{
m_linkStatusCallback = cb;
}
-
void
PeerLink::BeaconLoss ()
{
StateMachine (CNCL);
}
-
void
PeerLink::SetBeaconTimingElement (IeBeaconTiming beaconTiming)
{
m_beaconTiming = beaconTiming;
}
-
Mac48Address
PeerLink::GetPeerAddress () const
{
return m_peerAddress;
}
-
uint16_t
PeerLink::GetLocalAid () const
{
return m_assocId;
}
-
Time
PeerLink::GetLastBeacon () const
{
return m_lastBeacon;
}
-
Time
PeerLink::GetBeaconInterval () const
{
return m_beaconInterval;
}
-
IeBeaconTiming
PeerLink::GetBeaconTimingElement () const
{
return m_beaconTiming;
}
-
void
PeerLink::ClearTimingElement ()
{
m_beaconTiming.ClearTimingElement ();
}
-
-void PeerLink::MLMECancelPeerLink (PmpReasonCode reason)
+void
+PeerLink::MLMECancelPeerLink (PmpReasonCode reason)
{
StateMachine (CNCL,reason);
}
-
-void PeerLink::MLMEPassivePeerLinkOpen ()
+void
+PeerLink::MLMEPassivePeerLinkOpen ()
{
StateMachine (PASOPN);
}
-
-void PeerLink::MLMEActivePeerLinkOpen ()
+void
+PeerLink::MLMEActivePeerLinkOpen ()
{
StateMachine (ACTOPN);
}
-
-void PeerLink::MLMEPeeringRequestReject ()
+void
+PeerLink::MLMEPeeringRequestReject ()
{
StateMachine (REQ_RJCT, REASON11S_PEER_LINK_CANCELLED);
}
-
-void PeerLink::Close (uint16_t localLinkId, uint16_t peerLinkId, PmpReasonCode reason)
+void
+PeerLink::Close (uint16_t localLinkId, uint16_t peerLinkId, PmpReasonCode reason)
{
if (peerLinkId != 0 && m_localLinkId != peerLinkId)
return;
@@ -195,25 +189,32 @@
return;
StateMachine (CLS_ACPT, reason);
}
-
-void PeerLink::OpenAccept (uint16_t localLinkId, IeConfiguration conf)
+void
+PeerLink::OpenAccept (uint16_t localLinkId, IeConfiguration conf, Mac48Address peerMp)
{
if (m_peerLinkId == 0)
m_peerLinkId = localLinkId;
m_configuration = conf;
+ if(m_peerMeshPointAddress != Mac48Address::GetBroadcast ())
+ NS_ASSERT(m_peerMeshPointAddress == peerMp);
+ else
+ m_peerMeshPointAddress = peerMp;
StateMachine (OPN_ACPT);
}
-
-void PeerLink::OpenReject (uint16_t localLinkId, IeConfiguration conf,PmpReasonCode reason)
+void
+PeerLink::OpenReject (uint16_t localLinkId, IeConfiguration conf, Mac48Address peerMp, PmpReasonCode reason)
{
if ( m_peerLinkId == 0)
m_peerLinkId = localLinkId;
m_configuration = conf;
+ if(m_peerMeshPointAddress != Mac48Address::GetBroadcast ())
+ NS_ASSERT(m_peerMeshPointAddress == peerMp);
+ else
+ m_peerMeshPointAddress = peerMp;
StateMachine (OPN_RJCT, reason);
}
-
void
-PeerLink::ConfirmAccept (uint16_t localLinkId, uint16_t peerLinkId, uint16_t peerAid, IeConfiguration conf)
+PeerLink::ConfirmAccept (uint16_t localLinkId, uint16_t peerLinkId, uint16_t peerAid, IeConfiguration conf, Mac48Address peerMp)
{
if ( m_localLinkId != peerLinkId)
return;
@@ -223,12 +224,15 @@
return;
m_configuration = conf;
m_peerAssocId = peerAid;
+ if(m_peerMeshPointAddress != Mac48Address::GetBroadcast ())
+ NS_ASSERT(m_peerMeshPointAddress == peerMp);
+ else
+ m_peerMeshPointAddress = peerMp;
StateMachine (CNF_ACPT);
}
-
void
PeerLink::ConfirmReject (uint16_t localLinkId, uint16_t peerLinkId,
- IeConfiguration conf,PmpReasonCode reason)
+ IeConfiguration conf, Mac48Address peerMp, PmpReasonCode reason)
{
if (m_localLinkId != peerLinkId)
return;
@@ -237,15 +241,16 @@
else if (m_peerLinkId != localLinkId)
return;
m_configuration = conf;
+ if(m_peerMeshPointAddress != Mac48Address::GetBroadcast ())
+ NS_ASSERT(m_peerMeshPointAddress == peerMp);
+ m_peerMeshPointAddress = peerMp;
StateMachine (CNF_RJCT, reason);
}
-
bool
PeerLink::LinkIsEstab () const
{
return (m_state == ESTAB);
}
-
bool
PeerLink::LinkIsIdle () const
{
@@ -360,7 +365,8 @@
m_state = ESTAB;
ClearConfirmTimer ();
SendPeerLinkConfirm ();
- m_linkStatusCallback (m_interface, m_peerAddress, true);
+ NS_ASSERT(m_peerMeshPointAddress != Mac48Address::GetBroadcast ());
+ m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, true);
// TODO Callback MLME-SignalPeerLinkStatus
break;
case CLS_ACPT:
@@ -402,7 +408,8 @@
case CNF_ACPT:
m_state = ESTAB;
ClearRetryTimer ();
- m_linkStatusCallback (m_interface, m_peerAddress, true);
+ NS_ASSERT(m_peerMeshPointAddress != Mac48Address::GetBroadcast ());
+ m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, true);
// TODO Callback MLME-SignalPeerLinkStatus
break;
case CLS_ACPT:
@@ -444,7 +451,7 @@
m_state = HOLDING;
SendPeerLinkClose (REASON11S_MESH_CLOSE_RCVD);
SetHoldingTimer ();
- m_linkStatusCallback (m_interface, m_peerAddress, false);
+ m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, false);
break;
case OPN_RJCT:
case CNF_RJCT:
@@ -452,13 +459,13 @@
ClearRetryTimer ();
SendPeerLinkClose (reasoncode);
SetHoldingTimer ();
- m_linkStatusCallback (m_interface, m_peerAddress, false);
+ m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, false);
break;
case CNCL:
m_state = HOLDING;
SendPeerLinkClose (REASON11S_PEER_LINK_CANCELLED);
SetHoldingTimer ();
- m_linkStatusCallback (m_interface, m_peerAddress, false);
+ m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, false);
break;
default:
{}
@@ -490,80 +497,79 @@
break;
}
}
-
-void PeerLink::ClearRetryTimer ()
+void
+PeerLink::ClearRetryTimer ()
{
m_retryTimer.Cancel ();
}
-
-void PeerLink::ClearConfirmTimer ()
+void
+PeerLink::ClearConfirmTimer ()
{
m_confirmTimer.Cancel ();
}
-
-void PeerLink::ClearHoldingTimer ()
+void
+PeerLink::ClearHoldingTimer ()
{
m_holdingTimer.Cancel ();
}
-
-void PeerLink::SendPeerLinkClose (PmpReasonCode reasoncode)
+void
+PeerLink::SendPeerLinkClose (PmpReasonCode reasoncode)
{
IePeerManagement peerElement;
peerElement.SetPeerClose (m_localLinkId, m_peerLinkId, reasoncode);
- m_macPlugin->SendPeerLinkManagementFrame (m_peerAddress, m_assocId, peerElement, m_configuration);
+ m_macPlugin->SendPeerLinkManagementFrame (m_peerAddress, m_peerMeshPointAddress, m_assocId, peerElement, m_configuration);
}
-
-void PeerLink::SendPeerLinkOpen ()
+void
+PeerLink::SendPeerLinkOpen ()
{
IePeerManagement peerElement;
peerElement.SetPeerOpen (m_localLinkId);
NS_ASSERT (m_macPlugin != NULL);
- m_macPlugin->SendPeerLinkManagementFrame (m_peerAddress, m_assocId, peerElement, m_configuration);
+ m_macPlugin->SendPeerLinkManagementFrame (m_peerAddress, m_peerMeshPointAddress, m_assocId, peerElement, m_configuration);
}
-
-void PeerLink::SendPeerLinkConfirm ()
+void
+PeerLink::SendPeerLinkConfirm ()
{
IePeerManagement peerElement;
peerElement.SetPeerConfirm (m_localLinkId, m_peerLinkId);
- m_macPlugin->SendPeerLinkManagementFrame (m_peerAddress, m_assocId, peerElement, m_configuration);
+ m_macPlugin->SendPeerLinkManagementFrame (m_peerAddress, m_peerMeshPointAddress, m_assocId, peerElement, m_configuration);
}
-
-void PeerLink::SetHoldingTimer ()
+void
+PeerLink::SetHoldingTimer ()
{
NS_ASSERT(m_dot11MeshHoldingTimeout.GetMicroSeconds() !=0);
m_holdingTimer = Simulator::Schedule (m_dot11MeshHoldingTimeout, &PeerLink::HoldingTimeout, this);
}
-
-void PeerLink::HoldingTimeout ()
+void
+PeerLink::HoldingTimeout ()
{
StateMachine (TOH);
}
-
-void PeerLink::SetRetryTimer ()
+void
+PeerLink::SetRetryTimer ()
{
NS_ASSERT(m_dot11MeshRetryTimeout.GetMicroSeconds() !=0);
m_retryTimer = Simulator::Schedule (m_dot11MeshRetryTimeout, &PeerLink::RetryTimeout, this);
}
-
-void PeerLink::RetryTimeout ()
+void
+PeerLink::RetryTimeout ()
{
if ( m_retryCounter < m_dot11MeshMaxRetries)
StateMachine (TOR1);
else
StateMachine (TOR2);
}
-
-void PeerLink::SetConfirmTimer ()
+void
+PeerLink::SetConfirmTimer ()
{
NS_ASSERT(m_dot11MeshConfirmTimeout.GetMicroSeconds() !=0);
m_confirmTimer = Simulator::Schedule (m_dot11MeshConfirmTimeout, &PeerLink::ConfirmTimeout, this);
}
-
-void PeerLink::ConfirmTimeout ()
+void
+PeerLink::ConfirmTimeout ()
{
StateMachine (TOC);
-}
-
+}
} // namespace dot11s
} //namespace ns3
--- a/src/devices/mesh/dot11s/peer-link.h Wed Apr 01 20:48:05 2009 +0400
+++ b/src/devices/mesh/dot11s/peer-link.h Thu Apr 02 13:38:38 2009 +0400
@@ -58,21 +58,22 @@
* \name Peer link geeters/setters
* \{
*/
- void SetPeerAddress (Mac48Address macaddr);
- void SetInterface (uint32_t interface);
- void SetLocalLinkId (uint16_t id);
- void SetPeerLinkId (uint16_t id);
- void SetLocalAid (uint16_t aid);
- void SetPeerAid (uint16_t aid);
- void SetBeaconTimingElement (IeBeaconTiming beaconTiming);
- void SetPeerLinkDescriptorElement (IePeerManagement peerLinkElement);
+ void SetPeerAddress (Mac48Address macaddr);
+ void SetPeerMeshPointAddress (Mac48Address macaddr);
+ void SetInterface (uint32_t interface);
+ void SetLocalLinkId (uint16_t id);
+ void SetPeerLinkId (uint16_t id);
+ void SetLocalAid (uint16_t aid);
+ void SetPeerAid (uint16_t aid);
+ void SetBeaconTimingElement (IeBeaconTiming beaconTiming);
+ void SetPeerLinkDescriptorElement (IePeerManagement peerLinkElement);
Mac48Address GetPeerAddress () const;
uint16_t GetLocalAid () const;
- Time GetLastBeacon () const;
- Time GetBeaconInterval () const;
+ Time GetLastBeacon () const;
+ Time GetBeaconInterval () const;
IeBeaconTiming GetBeaconTimingElement ()const;
IePeerManagement GetPeerLinkDescriptorElement ()const;
- void ClearTimingElement ();
+ void ClearTimingElement ();
//\}
/**
@@ -88,7 +89,7 @@
/// MLME-PeeringRequestReject
void MLMEPeeringRequestReject ();
/// Callback type for MLME-SignalPeerLinkStatus event
- typedef Callback<void, uint32_t, Mac48Address, bool> SignalStatusCallback;
+ typedef Callback<void, uint32_t, Mac48Address, Mac48Address, bool> SignalStatusCallback;
/// Set callback
void MLMESetSignalStatusCallback (SignalStatusCallback);
//\}
@@ -106,21 +107,23 @@
/// Close link
void Close (uint16_t localLinkID, uint16_t peerLinkID, PmpReasonCode reason);
/// Accept open link
- void OpenAccept (uint16_t localLinkId, IeConfiguration conf);
+ void OpenAccept (uint16_t localLinkId, IeConfiguration conf, Mac48Address peerMp);
/// Reject open link
- void OpenReject (uint16_t localLinkId, IeConfiguration conf, PmpReasonCode reason);
+ void OpenReject (uint16_t localLinkId, IeConfiguration conf, Mac48Address peerMp, PmpReasonCode reason);
/// Confirm accept
void ConfirmAccept (
uint16_t localLinkId,
uint16_t peerLinkId,
uint16_t peerAid,
- IeConfiguration conf
+ IeConfiguration conf,
+ Mac48Address peerMp
);
/// Confirm reject
void ConfirmReject (
uint16_t localLinkId,
uint16_t peerLinkId,
IeConfiguration conf,
+ Mac48Address peerMp,
PmpReasonCode reason
);
//\}
@@ -204,6 +207,9 @@
Ptr<PeerManagerMacPlugin> m_macPlugin;
/// Peer address
Mac48Address m_peerAddress;
+ /// Mesh point address, equal to peer address in case of single
+ //interface mesh point
+ Mac48Address m_peerMeshPointAddress;
/// My ID of this link
uint16_t m_localLinkId;
/// Peer ID of this link
--- a/src/devices/mesh/dot11s/peer-management-plugin.cc Wed Apr 01 20:48:05 2009 +0400
+++ b/src/devices/mesh/dot11s/peer-management-plugin.cc Thu Apr 02 13:38:38 2009 +0400
@@ -88,8 +88,8 @@
return true;
NS_ASSERT(meshHdr.GetMeshTtl () == 1);
NS_ASSERT(meshHdr.GetAddressExt () == 1);
- NS_ASSERT(meshHdr.GetAddr4 () == header.GetAddr2 ());
Mac48Address peerAddress = header.GetAddr2 ();
+ Mac48Address peerMpAddress = meshHdr.GetAddr4 ();
PeerLinkFrameStart::PlinkFrameStartFields fields;
{
PeerLinkFrameStart peerFrame;
@@ -136,7 +136,7 @@
return true;
}
//Deliver Peer link management frame to protocol:
- m_protocol->ReceivePeerLinkFrame(m_ifIndex, peerAddress, fields.aid, peerElement, meshConfig);
+ m_protocol->ReceivePeerLinkFrame(m_ifIndex, peerAddress, peerMpAddress, fields.aid, peerElement, meshConfig);
// if we can handle a frame - drop it
return false;
}
@@ -159,6 +159,7 @@
void
PeerManagerMacPlugin::SendPeerLinkManagementFrame(
Mac48Address peerAddress,
+ Mac48Address peerMpAddress,
uint16_t aid,
IePeerManagement peerElement,
IeConfiguration meshConfig
@@ -204,14 +205,14 @@
meshHdr.SetMeshTtl (1);
meshHdr.SetMeshSeqno (0);
meshHdr.SetAddressExt(1);
- meshHdr.SetAddr4(m_parent->GetAddress ());
+ meshHdr.SetAddr4(m_protocol->GetAddress ());
packet->AddHeader (meshHdr);
//Wifi Mac header:
WifiMacHeader hdr;
hdr.SetMultihopAction ();
hdr.SetAddr1 (peerAddress);
hdr.SetAddr2 (m_parent->GetAddress ());
- hdr.SetAddr3 (peerAddress);
+ hdr.SetAddr3 (peerMpAddress);
hdr.SetDsNotFrom ();
hdr.SetDsNotTo ();
m_parent->SendManagementFrame(packet, hdr);
--- a/src/devices/mesh/dot11s/peer-management-plugin.h Wed Apr 01 20:48:05 2009 +0400
+++ b/src/devices/mesh/dot11s/peer-management-plugin.h Thu Apr 02 13:38:38 2009 +0400
@@ -66,6 +66,7 @@
void SetPeerManagerProtcol(Ptr<PeerManagementProtocol> protocol);
void SendPeerLinkManagementFrame(
Mac48Address peerAddress,
+ Mac48Address peerMpAddress,
uint16_t aid,
IePeerManagement peerElement,
IeConfiguration meshConfig
--- a/src/devices/mesh/dot11s/peer-management-protocol.cc Wed Apr 01 20:48:05 2009 +0400
+++ b/src/devices/mesh/dot11s/peer-management-protocol.cc Thu Apr 02 13:38:38 2009 +0400
@@ -118,6 +118,8 @@
m_peerLinks[(*i)->GetIfIndex()] = newmap;
}
// Mesh point aggregates all installed protocols
+ m_address = Mac48Address::ConvertFrom(mp->GetAddress ());
+ NS_LOG_UNCOND("MP address:"<<m_address);
mp->AggregateObject(this);
return true;
}
@@ -200,6 +202,10 @@
NS_ASSERT(plugin != m_plugins.end ());
plugin->second->SetBeaconShift(GetNextBeaconShift(interface));
//PM STATE Machine
+ //Check that a given beacon is not from our interface
+ for(PeerManagerPluginMap::const_iterator i = m_plugins.begin (); i != m_plugins.end (); i ++)
+ if(i->second->GetAddress () == peerAddress)
+ return;
Ptr<PeerLink> peerLink = FindPeerLink(interface, peerAddress);
if(peerLink !=0)
{
@@ -208,7 +214,7 @@
}
else
{
- peerLink = InitiateLink (interface, peerAddress, receivingTime, beaconInterval);
+ peerLink = InitiateLink (interface, peerAddress, Mac48Address::GetBroadcast (), receivingTime, beaconInterval);
peerLink->SetBeaconTimingElement (timingElement);
if (ShouldSendOpen (interface, peerAddress))
peerLink->MLMEActivePeerLinkOpen ();
@@ -219,6 +225,7 @@
PeerManagementProtocol::ReceivePeerLinkFrame (
uint32_t interface,
Mac48Address peerAddress,
+ Mac48Address peerMeshPointAddress,
uint16_t aid,
IePeerManagement peerManagementElement,
IeConfiguration meshConfig
@@ -230,19 +237,24 @@
PmpReasonCode reasonCode;
bool reject = ! (ShouldAcceptOpen (interface, peerAddress,reasonCode));
if (peerLink == 0)
- peerLink = InitiateLink (interface, peerAddress, Simulator::Now (), Seconds(1.0));
+ peerLink = InitiateLink (interface, peerAddress, peerMeshPointAddress, Simulator::Now (), Seconds(1.0));
if(!reject)
{
peerLink->MLMEPassivePeerLinkOpen ();
- peerLink->OpenAccept (peerManagementElement.GetLocalLinkId(), meshConfig);
+ peerLink->OpenAccept (peerManagementElement.GetLocalLinkId(), meshConfig, peerMeshPointAddress);
}
else
- peerLink->OpenReject (peerManagementElement.GetLocalLinkId(), meshConfig, reasonCode);
+ peerLink->OpenReject (peerManagementElement.GetLocalLinkId(), meshConfig, peerMeshPointAddress, reasonCode);
}
if (peerLink == 0)
return;
if (peerManagementElement.SubtypeIsConfirm ())
- peerLink->ConfirmAccept (peerManagementElement.GetLocalLinkId(), peerManagementElement.GetPeerLinkId(), aid, meshConfig);
+ peerLink->ConfirmAccept (
+ peerManagementElement.GetLocalLinkId(),
+ peerManagementElement.GetPeerLinkId(),
+ aid,
+ meshConfig,
+ peerMeshPointAddress);
if (peerManagementElement.SubtypeIsClose ())
peerLink->Close (
peerManagementElement.GetLocalLinkId(),
@@ -263,6 +275,7 @@
PeerManagementProtocol::InitiateLink (
uint32_t interface,
Mac48Address peerAddress,
+ Mac48Address peerMeshPointAddress,
Time lastBeacon,
Time beaconInterval)
{
@@ -289,6 +302,7 @@
new_link->SetInterface (interface);
new_link->SetLocalLinkId (m_lastLocalLinkId++);
new_link->SetPeerAddress (peerAddress);
+ new_link->SetPeerMeshPointAddress (peerMeshPointAddress);
new_link->SetBeaconInformation (lastBeacon, beaconInterval);
new_link->SetMacPlugin (plugin->second);
new_link->MLMESetSignalStatusCallback (MakeCallback(&PeerManagementProtocol::PeerLinkStatus, this));
@@ -306,7 +320,7 @@
return 0;
}
void
-PeerManagementProtocol::SetPeerLinkStatusCallback(Callback <void, Mac48Address, uint32_t, bool> cb)
+PeerManagementProtocol::SetPeerLinkStatusCallback(Callback <void, Mac48Address, Mac48Address, uint32_t, bool> cb)
{
m_peerStatusCallback = cb;
}
@@ -364,7 +378,10 @@
return true;
}
bool
-PeerManagementProtocol::ShouldAcceptOpen (uint32_t interface, Mac48Address peerAddress, PmpReasonCode & reasonCode)
+PeerManagementProtocol::ShouldAcceptOpen (
+ uint32_t interface,
+ Mac48Address peerAddress,
+ PmpReasonCode & reasonCode)
{
if (m_numberOfActivePeers > m_maxNumberOfPeerLinks)
{
@@ -450,23 +467,29 @@
return MicroSeconds (0);
}
void
-PeerManagementProtocol::PeerLinkStatus (uint32_t interface, Mac48Address peerAddress, bool status)
+PeerManagementProtocol::PeerLinkStatus (uint32_t interface, Mac48Address peerAddress, Mac48Address peerMeshPointAddress, bool status)
{
PeerManagerPluginMap::iterator plugin = m_plugins.find (interface);
NS_ASSERT(plugin != m_plugins.end());
NS_LOG_DEBUG(
- "LINK between me:"<<plugin->second->GetAddress() <<
- " and peer:"<<peerAddress<<
- ", at interface "<<interface<<
- "Status(1 - opened, 0 - closed)"<<status);
+ "Link between me:" << m_address <<
+ " my interface:" << plugin->second->GetAddress() <<
+ " and peer mesh point:" << peerMeshPointAddress <<
+ " and its interface:" << peerAddress <<
+ ", at my interface ID:" << interface <<
+ ". Status:" << status);
if(status)
m_numberOfActivePeers ++;
else
m_numberOfActivePeers --;
if(!m_peerStatusCallback.IsNull ())
- m_peerStatusCallback (peerAddress, interface, status);
+ m_peerStatusCallback (peerMeshPointAddress, peerAddress, interface, status);
}
-
+Mac48Address
+PeerManagementProtocol::GetAddress ()
+{
+ return m_address;
+}
} // namespace dot11s
} //namespace ns3
--- a/src/devices/mesh/dot11s/peer-management-protocol.h Wed Apr 01 20:48:05 2009 +0400
+++ b/src/devices/mesh/dot11s/peer-management-protocol.h Thu Apr 02 13:38:38 2009 +0400
@@ -101,6 +101,8 @@
* \param uint32_t - is a interface ID of a given MAC (interfaceID rather
* than MAC address, beacause many interfaces may have the same MAC)
* \param Mac48Address is address of peer
+ * \param Mac48Address is address of peer mesh point device (equal
+ * to peer address when only one interface)
* \param uint16_t is association ID, which peer has assigned to
* us
* \param IeConfiguration is mesh configuration element
@@ -110,6 +112,7 @@
void ReceivePeerLinkFrame(
uint32_t interface,
Mac48Address peerAddress,
+ Mac48Address peerMeshPointAddress,
uint16_t aid,
IePeerManagement peerManagementElement,
IeConfiguration meshConfig
@@ -126,8 +129,10 @@
//\}
///\brief Needed by external module to do MLME
Ptr<PeerLink> FindPeerLink(uint32_t interface, Mac48Address peerAddress);
- void SetPeerLinkStatusCallback (Callback<void, Mac48Address, uint32_t, bool> cb);
+ void SetPeerLinkStatusCallback (Callback<void, Mac48Address, Mac48Address, uint32_t, bool> cb);
std::vector<Mac48Address> GetActiveLinks(uint32_t interface);
+ ///\brief needed by plugins to set global source address
+ Mac48Address GetAddress ();
private:
/** \name Private structures
* \{
@@ -158,7 +163,13 @@
* Return a position in beacon-storage for a given remote station
*/
void FillBeaconInfo(uint32_t interface, Mac48Address peerAddress, Time receivingTime, Time beaconInterval);
- Ptr<PeerLink> InitiateLink (uint32_t interface, Mac48Address peerAddress, Time lastBeacon, Time beaconInterval);
+ Ptr<PeerLink> InitiateLink (
+ uint32_t interface,
+ Mac48Address peerAddress,
+ Mac48Address peerMeshPointAddress,
+ Time lastBeacon,
+ Time beaconInterval
+ );
/**
* \name External peer-chooser
* \{
@@ -169,7 +180,7 @@
* \}
* \brief Indicates changes in peer links
*/
- void PeerLinkStatus (uint32_t interface, Mac48Address peerAddress, bool status);
+ void PeerLinkStatus (uint32_t interface, Mac48Address peerAddress, Mac48Address peerMeshPointAddres, bool status);
/**
* Removes all links which are idle
*/
@@ -178,6 +189,7 @@
Time GetNextBeaconShift (uint32_t interface);
private:
PeerManagerPluginMap m_plugins;
+ Mac48Address m_address;
/**
* \name Information related to beacons:
* \{
@@ -205,11 +217,12 @@
EventId m_cleanupEvent;
///\}
///\brief Callback to notify about peer link changes:
- ///\param Mac48Address is peer address
+ ///\param Mac48Address is peer address of mesh point
+ ///\param Mac48Address is peer address of interface
///\param uint32_t - interface ID
///\param bool is staus - true when new link has appeared, false -
//when link was closed
- Callback <void, Mac48Address, uint32_t, bool> m_peerStatusCallback;
+ Callback <void, Mac48Address, Mac48Address, uint32_t, bool> m_peerStatusCallback;
};
} // namespace dot11s
--- a/src/devices/mesh/mesh-l2-routing-protocol.h Wed Apr 01 20:48:05 2009 +0400
+++ b/src/devices/mesh/mesh-l2-routing-protocol.h Thu Apr 02 13:38:38 2009 +0400
@@ -95,11 +95,6 @@
*/
virtual bool RequestRoute (uint32_t sourceIface, const Mac48Address source, const Mac48Address destination,
Ptr<Packet> packet, uint16_t protocolType, RouteReplyCallback routeReply ) = 0;
- ///\return false if packet should be dropeed
- ///\details If incoming frame is our frame - we pass a packet
- //through protocol, because protocol needs to remove all tags and
- //check TTL
- virtual bool HandleIncomingFrame (Ptr<Packet> packet, Mac48Address src, Mac48Address dst, uint16_t protocol) = 0;
/// Set host mesh point, analog of SetNode (...) methods for upper layer protocols.
void SetMeshPoint (Ptr<MeshPointDevice> mp);
/// Each mesh protocol must be installed on the mesh point to work.