21 #include "ie-dot11s-configuration.h"
22 #include "ie-dot11s-peer-management.h"
23 #include "dot11s-mac-header.h"
24 #include "peer-management-protocol-mac.h"
25 #include "peer-management-protocol.h"
26 #include "peer-link-frame.h"
27 #include "ns3/mesh-wifi-interface-mac.h"
28 #include "ns3/simulator.h"
29 #include "ns3/wifi-mac-header.h"
30 #include "ns3/mesh-information-element-vector.h"
34 PeerManagementProtocolMac::PeerManagementProtocolMac (uint32_t interface,
35 Ptr<PeerManagementProtocol> protocol)
37 m_ifIndex = interface;
38 m_protocol = protocol;
41 PeerManagementProtocolMac::~PeerManagementProtocolMac ()
50 m_parent->TraceConnectWithoutContext (
"TxOkHeader",
MakeCallback (&PeerManagementProtocolMac::TxOk,
this));
55 m_protocol->TransmissionFailure (m_ifIndex, hdr.GetAddr1 ());
60 m_protocol->TransmissionSuccess (m_ifIndex, hdr.GetAddr1 ());
68 if (header.IsBeacon ())
77 if ((meshId != 0) && (m_protocol->GetMeshId ()->IsEqual (*meshId)))
79 m_protocol->ReceiveBeacon (m_ifIndex, header.GetAddr2 (),
MicroSeconds (
80 beacon_hdr.GetBeaconIntervalUs ()), beaconTiming);
85 if (header.IsAction ())
91 if (actionHdr.GetCategory () != WifiActionHeader::MESH_PEERING_MGT)
93 return m_protocol->IsActiveLink (m_ifIndex, header.GetAddr2 ());
96 m_stats.rxMgtBytes += packet->
GetSize ();
104 fields = peerFrame.GetFields ();
105 NS_ASSERT (fields.subtype == actionValue.peerLink);
107 if ((actionValue.peerLink != WifiActionHeader::PEER_LINK_CLOSE) && !(m_parent->CheckSupportedRates (
110 m_protocol->ConfigurationMismatch (m_ifIndex, peerAddress);
115 if ((actionValue.peerLink != WifiActionHeader::PEER_LINK_CONFIRM) && !fields.meshId.IsEqual (
116 *(m_protocol->GetMeshId ())))
118 m_protocol->ConfigurationMismatch (m_ifIndex, peerAddress);
127 peerElement = DynamicCast<IePeerManagement>(elements.
FindFirst (IE11S_PEERING_MANAGEMENT));
130 if (peerElement->SubtypeIsOpen ())
133 NS_ASSERT (actionValue.peerLink == WifiActionHeader::PEER_LINK_OPEN);
135 if (peerElement->SubtypeIsConfirm ())
138 NS_ASSERT (actionValue.peerLink == WifiActionHeader::PEER_LINK_CONFIRM);
140 if (peerElement->SubtypeIsClose ())
143 NS_ASSERT (actionValue.peerLink == WifiActionHeader::PEER_LINK_CLOSE);
146 m_protocol->ReceivePeerLinkFrame (m_ifIndex, peerAddress, peerMpAddress, fields.aid, *peerElement,
151 return m_protocol->IsActiveLink (m_ifIndex, header.GetAddr2 ());
157 if (header.IsAction ())
161 if (actionHdr.GetCategory () == WifiActionHeader::MESH_PEERING_MGT)
166 if (header.GetAddr1 ().
IsGroup ())
172 if (m_protocol->IsActiveLink (m_ifIndex, header.GetAddr1 ()))
186 if (m_protocol->GetBeaconCollisionAvoidance ())
200 meshConfig.SetNeighborCount (m_protocol->GetNumberOfLinks ());
206 fields.rates = m_parent->GetSupportedRates ();
207 fields.capability = 0;
208 fields.meshId = *(m_protocol->GetMeshId ());
209 fields.config = meshConfig;
214 if (peerElement.SubtypeIsOpen ())
218 action.peerLink = WifiActionHeader::PEER_LINK_OPEN;
219 fields.subtype = WifiActionHeader::PEER_LINK_OPEN;
220 actionHdr.SetAction (WifiActionHeader::MESH_PEERING_MGT, action);
222 if (peerElement.SubtypeIsConfirm ())
226 action.peerLink = WifiActionHeader::PEER_LINK_CONFIRM;
228 fields.subtype = WifiActionHeader::PEER_LINK_CONFIRM;
229 actionHdr.SetAction (WifiActionHeader::MESH_PEERING_MGT, action);
231 if (peerElement.SubtypeIsClose ())
234 WifiActionHeader::ActionValue action;
235 action.peerLink = WifiActionHeader::PEER_LINK_CLOSE;
236 fields.subtype = WifiActionHeader::PEER_LINK_CLOSE;
237 fields.reasonCode = peerElement.GetReasonCode ();
238 actionHdr.SetAction (WifiActionHeader::MESH_PEERING_MGT, action);
240 plinkFrame.SetPlinkFrameStart (fields);
244 m_stats.txMgtBytes += packet->
GetSize ();
248 hdr.SetAddr1 (peerAddress);
249 hdr.SetAddr2 (m_parent->GetAddress ());
251 hdr.SetAddr3 (m_protocol->GetAddress ());
254 m_parent->SendManagementFrame (packet, hdr);
262 return m_parent->GetAddress ();
274 m_stats.beaconShift++;
276 m_parent->ShiftTbtt (shift);
278 PeerManagementProtocolMac::Statistics::Statistics () :
279 txOpen (0), txConfirm (0), txClose (0), rxOpen (0), rxConfirm (0), rxClose (0), dropped (0), brokenMgt (0),
280 txMgt (0), txMgtBytes (0), rxMgt (0), rxMgtBytes (0), beaconShift (0)
284 PeerManagementProtocolMac::Statistics::Print (std::ostream & os)
const
287 "txOpen=\"" << txOpen <<
"\"" << std::endl <<
288 "txConfirm=\"" << txConfirm <<
"\"" << std::endl <<
289 "txClose=\"" << txClose <<
"\"" << std::endl <<
290 "rxOpen=\"" << rxOpen <<
"\"" << std::endl <<
291 "rxConfirm=\"" << rxConfirm <<
"\"" << std::endl <<
292 "rxClose=\"" << rxClose <<
"\"" << std::endl <<
293 "dropped=\"" << dropped <<
"\"" << std::endl <<
294 "brokenMgt=\"" << brokenMgt <<
"\"" << std::endl <<
295 "txMgt=\"" << txMgt <<
"\"" << std::endl <<
296 "txMgtBytes=\"" << txMgtBytes <<
"\"" << std::endl <<
297 "rxMgt=\"" << rxMgt <<
"\"" << std::endl <<
298 "rxMgtBytes=\"" << rxMgtBytes <<
"\"" << std::endl <<
299 "beaconShift=\"" << beaconShift <<
"\"/>" << std::endl;
302 PeerManagementProtocolMac::Report (std::ostream & os)
const
304 os <<
"<PeerManagementProtocolMac "
305 "address=\"" << m_parent->GetAddress () <<
"\">" << std::endl;
307 os <<
"</PeerManagementProtocolMac>" << std::endl;
310 PeerManagementProtocolMac::ResetStats ()
312 m_stats = Statistics ();
315 PeerManagementProtocolMac::GetLinkMetric (Mac48Address peerAddress)
317 return m_parent->GetLinkMetric (peerAddress);
322 return m_protocol->AssignStreams (stream);
uint32_t RemoveHeader(Header &header)
void AddInformationElement(Ptr< WifiInformationElement > ie)
Add information element.
smart pointer class similar to boost::intrusive_ptr
void SetBeaconShift(Time shift)
BCA functionality.
802.11s Peer link management frame
void SetPlinkFrameSubtype(uint8_t subtype)
#define NS_ASSERT(condition)
uint32_t GetSize(void) const
int64_t AssignStreams(int64_t stream)
See 7.3.2.85 of draft 2.07.
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
bool UpdateOutcomingFrame(Ptr< Packet > packet, WifiMacHeader &header, Mac48Address from, Mac48Address to)
Update frame before it will be forwarded down.
Ptr< Packet > Copy(void) const
uint32_t PeekHeader(Header &header) const
Mac48Address GetAddress() const
debug only, used to print established links
Beacon is beacon header + list of arbitrary information elements.
Time GetBeaconInterval() const
Returns a beacon interval of wifi beacon.
Time Seconds(double seconds)
create ns3::Time instances in units of seconds.
void UpdateBeacon(MeshWifiBeacon &beacon) const
Update beacon before it will be formed and sent.
Describes Mesh Configuration Element see 7.3.2.86 of 802.11s draft 3.0.
bool Receive(Ptr< Packet > packet, const WifiMacHeader &header)
Process received frame.
void SetParent(Ptr< MeshWifiInterfaceMac > parent)
Each plugin must be installed on interface to work.
void TxError(WifiMacHeader const &hdr)
Closes link when a proper number of successive transmissions have failed.
Time MicroSeconds(uint64_t us)
create ns3::Time instances in units of microseconds.
void AddHeader(const Header &header)