mesh: Logging and some cleanup of peer link models

This commit is contained in:
Tom Henderson
2017-04-08 22:47:18 -07:00
parent 7aa31ecd5c
commit 950f538931
4 changed files with 48 additions and 5 deletions

View File

@@ -87,6 +87,8 @@ PeerLink::GetTypeId ()
return tid;
}
const char* const
PeerLink::PeerStateNames[6] = { "IDLE", "OPN_SNT", "CNF_RCVD", "OPN_RCVD", "ESTAB", "HOLDING" };
//-----------------------------------------------------------------------------
// PeerLink public interface
@@ -105,6 +107,7 @@ PeerLink::PeerLink () :
m_retryCounter (0),
m_maxPacketFail (3)
{
NS_LOG_FUNCTION (this);
}
PeerLink::~PeerLink ()
{
@@ -112,6 +115,7 @@ PeerLink::~PeerLink ()
void
PeerLink::DoDispose ()
{
NS_LOG_FUNCTION (this);
m_retryTimer.Cancel ();
m_holdingTimer.Cancel ();
m_confirmTimer.Cancel ();
@@ -161,6 +165,7 @@ PeerLink::MLMESetSignalStatusCallback (PeerLink::SignalStatusCallback cb)
void
PeerLink::BeaconLoss ()
{
NS_LOG_FUNCTION (this);
StateMachine (CNCL);
}
void
@@ -171,9 +176,11 @@ PeerLink::TransmissionSuccess ()
void
PeerLink::TransmissionFailure ()
{
NS_LOG_FUNCTION (this);
m_packetFail++;
if (m_packetFail == m_maxPacketFail)
{
NS_LOG_DEBUG ("TransmissionFailure:: CNCL");
StateMachine (CNCL);
m_packetFail = 0;
}
@@ -233,6 +240,7 @@ PeerLink::MLMEPeeringRequestReject ()
void
PeerLink::Close (uint16_t localLinkId, uint16_t peerLinkId, PmpReasonCode reason)
{
NS_LOG_FUNCTION (this << localLinkId << peerLinkId << reason);
if (peerLinkId != 0 && m_localLinkId != peerLinkId)
{
return;
@@ -253,6 +261,7 @@ PeerLink::Close (uint16_t localLinkId, uint16_t peerLinkId, PmpReasonCode reason
void
PeerLink::OpenAccept (uint16_t localLinkId, IeConfiguration conf, Mac48Address peerMp)
{
NS_LOG_FUNCTION (this << localLinkId << peerMp);
m_peerLinkId = localLinkId;
m_configuration = conf;
if (m_peerMeshPointAddress != Mac48Address::GetBroadcast ())
@@ -268,6 +277,7 @@ PeerLink::OpenAccept (uint16_t localLinkId, IeConfiguration conf, Mac48Address p
void
PeerLink::OpenReject (uint16_t localLinkId, IeConfiguration conf, Mac48Address peerMp, PmpReasonCode reason)
{
NS_LOG_FUNCTION (this << localLinkId << peerMp << reason);
if (m_peerLinkId == 0)
{
m_peerLinkId = localLinkId;
@@ -287,6 +297,7 @@ void
PeerLink::ConfirmAccept (uint16_t localLinkId, uint16_t peerLinkId, uint16_t peerAid, IeConfiguration conf,
Mac48Address peerMp)
{
NS_LOG_FUNCTION (this << localLinkId << peerLinkId << peerAid << peerMp);
if (m_localLinkId != peerLinkId)
{
return;
@@ -318,6 +329,7 @@ void
PeerLink::ConfirmReject (uint16_t localLinkId, uint16_t peerLinkId, IeConfiguration conf,
Mac48Address peerMp, PmpReasonCode reason)
{
NS_LOG_FUNCTION (this << localLinkId << peerLinkId << peerMp << reason);
if (m_localLinkId != peerLinkId)
{
return;
@@ -655,6 +667,7 @@ PeerLink::SetHoldingTimer ()
void
PeerLink::HoldingTimeout ()
{
NS_LOG_FUNCTION (this);
StateMachine (TOH);
}
void
@@ -666,12 +679,15 @@ PeerLink::SetRetryTimer ()
void
PeerLink::RetryTimeout ()
{
NS_LOG_FUNCTION (this);
if (m_retryCounter < m_dot11MeshMaxRetries)
{
NS_LOG_LOGIC ("Retry timeout TOR1");
StateMachine (TOR1);
}
else
{
NS_LOG_LOGIC ("Retry timeout TOR2");
StateMachine (TOR2);
}
}

View File

@@ -59,6 +59,10 @@ public:
ESTAB,
HOLDING,
};
/**
* \brief Literal names of Mesh Peer Management states for use in log messages
*/
static const char* const PeerStateNames[6];
/// Process beacon received from peer
void SetBeaconInformation (Time lastBeacon, Time BeaconInterval);
/**

View File

@@ -29,7 +29,11 @@
#include "ns3/wifi-mac-header.h"
#include "ns3/mesh-information-element-vector.h"
#include "ns3/log.h"
namespace ns3 {
NS_LOG_COMPONENT_DEFINE ("PeerManagementProtocolMac");
namespace dot11s {
PeerManagementProtocolMac::PeerManagementProtocolMac (uint32_t interface,
Ptr<PeerManagementProtocol> protocol)
@@ -62,11 +66,13 @@ PeerManagementProtocolMac::TxOk (WifiMacHeader const &hdr)
bool
PeerManagementProtocolMac::Receive (Ptr<Packet> const_packet, const WifiMacHeader & header)
{
NS_LOG_FUNCTION (this << const_packet << header);
// First of all we copy a packet, because we need to remove some
//headers
Ptr<Packet> packet = const_packet->Copy ();
if (header.IsBeacon ())
{
NS_LOG_DEBUG ("Is Beacon from " << header.GetAddr2 ());
MgtBeaconHeader beacon_hdr;
packet->RemoveHeader (beacon_hdr);
MeshInformationElementVector elements;
@@ -79,6 +85,10 @@ PeerManagementProtocolMac::Receive (Ptr<Packet> const_packet, const WifiMacHeade
m_protocol->ReceiveBeacon (m_ifIndex, header.GetAddr2 (), MicroSeconds (
beacon_hdr.GetBeaconIntervalUs ()), beaconTiming);
}
else
{
NS_LOG_DEBUG ("MeshId mismatch " << m_protocol->GetMeshId ()->PeekString () << " " << (*meshId) << "; ignoring");
}
// Beacon shall not be dropped. May be needed to another plugins
return true;
}
@@ -86,12 +96,14 @@ PeerManagementProtocolMac::Receive (Ptr<Packet> const_packet, const WifiMacHeade
IeConfiguration config;
if (header.IsAction ())
{
NS_LOG_DEBUG ("Is action");
WifiActionHeader actionHdr;
packet->RemoveHeader (actionHdr);
WifiActionHeader::ActionValue actionValue = actionHdr.GetAction ();
// If can not handle - just return;
if (actionHdr.GetCategory () != WifiActionHeader::SELF_PROTECTED)
{
NS_LOG_DEBUG ("Cannot handle non SELF PROTECTED");
return m_protocol->IsActiveLink (m_ifIndex, header.GetAddr2 ());
}
m_stats.rxMgt++;
@@ -100,12 +112,14 @@ PeerManagementProtocolMac::Receive (Ptr<Packet> const_packet, const WifiMacHeade
Mac48Address peerMpAddress = header.GetAddr3 ();
if (actionValue.selfProtectedAction == WifiActionHeader::PEER_LINK_OPEN)
{
NS_LOG_DEBUG ("Received PEER_LINK_OPEN");
PeerLinkOpenStart::PlinkOpenStartFields fields;
PeerLinkOpenStart peerFrame;
packet->RemoveHeader (peerFrame);
fields = peerFrame.GetFields ();
if (!fields.meshId.IsEqual ( *(m_protocol->GetMeshId ())))
{
NS_LOG_DEBUG ("PEER_LINK_OPEN: MeshId mismatch");
m_protocol->ConfigurationMismatch (m_ifIndex, peerAddress);
// Broken peer link frame - drop it
m_stats.brokenMgt++;
@@ -113,6 +127,7 @@ PeerManagementProtocolMac::Receive (Ptr<Packet> const_packet, const WifiMacHeade
}
if (!(m_parent->CheckSupportedRates (fields.rates)))
{
NS_LOG_DEBUG ("PEER_LINK_OPEN: configuration mismatch");
m_protocol->ConfigurationMismatch (m_ifIndex, peerAddress);
// Broken peer link frame - drop it
m_stats.brokenMgt++;
@@ -122,12 +137,14 @@ PeerManagementProtocolMac::Receive (Ptr<Packet> const_packet, const WifiMacHeade
}
else if (actionValue.selfProtectedAction == WifiActionHeader::PEER_LINK_CONFIRM)
{
NS_LOG_DEBUG ("Received PEER_LINK_CONFIRM");
PeerLinkConfirmStart::PlinkConfirmStartFields fields;
PeerLinkConfirmStart peerFrame;
packet->RemoveHeader (peerFrame);
fields = peerFrame.GetFields ();
if (!(m_parent->CheckSupportedRates (fields.rates)))
{
NS_LOG_DEBUG ("PEER_LINK_CONFIRM: configuration mismatch");
m_protocol->ConfigurationMismatch (m_ifIndex, peerAddress);
// Broken peer link frame - drop it
m_stats.brokenMgt++;
@@ -138,12 +155,14 @@ PeerManagementProtocolMac::Receive (Ptr<Packet> const_packet, const WifiMacHeade
}
else if (actionValue.selfProtectedAction == WifiActionHeader::PEER_LINK_CLOSE)
{
NS_LOG_DEBUG ("Received PEER_LINK_CLOSE");
PeerLinkCloseStart::PlinkCloseStartFields fields;
PeerLinkCloseStart peerFrame;
packet->RemoveHeader (peerFrame);
fields = peerFrame.GetFields ();
if (!fields.meshId.IsEqual ( *(m_protocol->GetMeshId ())))
{
NS_LOG_DEBUG ("PEER_LINK_CLOSE: configuration mismatch");
m_protocol->ConfigurationMismatch (m_ifIndex, peerAddress);
// Broken peer link frame - drop it
m_stats.brokenMgt++;
@@ -188,6 +207,7 @@ bool
PeerManagementProtocolMac::UpdateOutcomingFrame (Ptr<Packet> packet, WifiMacHeader & header,
Mac48Address from, Mac48Address to)
{
NS_LOG_FUNCTION (this << packet << header << from << to);
if (header.IsAction ())
{
WifiActionHeader actionHdr;
@@ -230,6 +250,7 @@ void
PeerManagementProtocolMac::SendPeerLinkManagementFrame (Mac48Address peerAddress, Mac48Address peerMpAddress,
uint16_t aid, IePeerManagement peerElement, IeConfiguration meshConfig)
{
NS_LOG_FUNCTION (this << peerAddress << peerMpAddress);
//Create a packet:
meshConfig.SetNeighborCount (m_protocol->GetNumberOfLinks ());
Ptr<Packet> packet = Create<Packet> ();

View File

@@ -365,14 +365,14 @@ PeerManagementProtocol::IsActiveLink (uint32_t interface, Mac48Address peerAddre
bool
PeerManagementProtocol::ShouldSendOpen (uint32_t interface, Mac48Address peerAddress)
{
return (m_stats.linksTotal <= m_maxNumberOfPeerLinks);
return (m_stats.linksTotal < m_maxNumberOfPeerLinks);
}
bool
PeerManagementProtocol::ShouldAcceptOpen (uint32_t interface, Mac48Address peerAddress,
PmpReasonCode & reasonCode)
{
if (m_stats.linksTotal > m_maxNumberOfPeerLinks)
if (m_stats.linksTotal >= m_maxNumberOfPeerLinks)
{
reasonCode = REASON11S_MESH_MAX_PEERS;
return false;
@@ -498,9 +498,11 @@ PeerManagementProtocol::PeerLinkStatus (uint32_t interface, Mac48Address peerAdd
{
PeerManagementProtocolMacMap::iterator plugin = m_plugins.find (interface);
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);
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:" << PeerLink::PeerStateNames[ostate]
<< " -> " << PeerLink::PeerStateNames[nstate]);
if ((nstate == PeerLink::ESTAB) && (ostate != PeerLink::ESTAB))
{
NotifyLinkOpen (peerMeshPointAddress, peerAddress, plugin->second->GetAddress (), interface);