diff --git a/src/devices/mesh/dot11s/dot11s-mac-header.cc b/src/devices/mesh/dot11s/dot11s-mac-header.cc index f81195229..a87ccac8a 100644 --- a/src/devices/mesh/dot11s/dot11s-mac-header.cc +++ b/src/devices/mesh/dot11s/dot11s-mac-header.cc @@ -174,145 +174,5 @@ operator== (const MeshHeader & a, const MeshHeader & b) && (a.m_meshSeqno == b.m_meshSeqno) && (a.m_addr4 == b.m_addr4) && (a.m_addr5 == b.m_addr5) && (a.m_addr6 == b.m_addr6)); } -/********************************************************** - * ActionFrame - **********************************************************/ -WifiMeshActionHeader::WifiMeshActionHeader () -{ -} -WifiMeshActionHeader::~WifiMeshActionHeader () -{ -} -void -WifiMeshActionHeader::SetAction (WifiMeshActionHeader::CategoryValue type, - WifiMeshActionHeader::ActionValue action) -{ - m_category = type; - - switch (type) - { - case MESH_PEERING_MGT: - { - m_actionValue = action.peerLink; - break; - } - case MESH_PATH_SELECTION: - { - m_actionValue = action.pathSelection; - break; - } - case MESH_LINK_METRIC: - case MESH_INTERWORKING: - case MESH_RESOURCE_COORDINATION: - case MESH_PROXY_FORWARDING: - break; - } -} -WifiMeshActionHeader::CategoryValue -WifiMeshActionHeader::GetCategory () -{ - switch (m_category) - { - case MESH_PEERING_MGT: - return MESH_PEERING_MGT; - case MESH_LINK_METRIC: - return MESH_LINK_METRIC; - case MESH_PATH_SELECTION: - return MESH_PATH_SELECTION; - case MESH_INTERWORKING: - return MESH_INTERWORKING; - case MESH_RESOURCE_COORDINATION: - return MESH_RESOURCE_COORDINATION; - case MESH_PROXY_FORWARDING: - return MESH_PROXY_FORWARDING; - default: - NS_FATAL_ERROR ("Unknown action value"); - return MESH_PEERING_MGT; - } -} -WifiMeshActionHeader::ActionValue -WifiMeshActionHeader::GetAction () -{ - ActionValue retval; - retval.peerLink = PEER_LINK_OPEN; // Needs to be initialized to something to quiet valgrind in default cases - switch (m_category) - { - case MESH_PEERING_MGT: - switch (m_actionValue) - { - case PEER_LINK_OPEN: - retval.peerLink = PEER_LINK_OPEN; - return retval; - case PEER_LINK_CONFIRM: - retval.peerLink = PEER_LINK_CONFIRM; - return retval; - case PEER_LINK_CLOSE: - retval.peerLink = PEER_LINK_CLOSE; - return retval; - default: - NS_FATAL_ERROR ("Unknown mesh peering management action code"); - retval.peerLink = PEER_LINK_OPEN; /* quiet compiler */ - return retval; - } - case MESH_PATH_SELECTION: - switch (m_actionValue) - { - case PATH_SELECTION: - retval.pathSelection = PATH_SELECTION; - return retval; - default: - NS_FATAL_ERROR ("Unknown mesh path selection action code"); - retval.peerLink = PEER_LINK_OPEN; /* quiet compiler */ - return retval; - } - case MESH_LINK_METRIC: - // not yet supported - case MESH_INTERWORKING: - // not yet supported - case MESH_RESOURCE_COORDINATION: - // not yet supported - default: - NS_FATAL_ERROR ("Unsupported mesh action"); - retval.peerLink = PEER_LINK_OPEN; /* quiet compiler */ - return retval; - } -} -TypeId -WifiMeshActionHeader::GetTypeId () -{ - static TypeId tid = TypeId ("ns3::WifiMeshActionHeader") - .SetParent
() - .AddConstructor (); - return tid; -} -TypeId -WifiMeshActionHeader::GetInstanceTypeId () const -{ - return GetTypeId (); -} -void -WifiMeshActionHeader::Print (std::ostream &os) const -{ -} -uint32_t -WifiMeshActionHeader::GetSerializedSize () const -{ - return 2; -} -void -WifiMeshActionHeader::Serialize (Buffer::Iterator start) const -{ - start.WriteU8 (m_category); - start.WriteU8 (m_actionValue); -} -uint32_t -WifiMeshActionHeader::Deserialize (Buffer::Iterator start) -{ - Buffer::Iterator i = start; - m_category = i.ReadU8 (); - m_actionValue = i.ReadU8 (); - return i.GetDistanceFrom (start); -} - } //namespace dot11s } // namespace ns3 diff --git a/src/devices/mesh/dot11s/dot11s-mac-header.h b/src/devices/mesh/dot11s/dot11s-mac-header.h index 57803b53a..9c9817728 100644 --- a/src/devices/mesh/dot11s/dot11s-mac-header.h +++ b/src/devices/mesh/dot11s/dot11s-mac-header.h @@ -73,85 +73,6 @@ private: }; bool operator== (const MeshHeader & a, const MeshHeader & b); -/** - * \ingroup dot11s - * - * \brief See IEEE 802.11s draft 3.0 section 7.2.3.14 - * - * Header format: | category: 1 | action value: 1 | - */ -class WifiMeshActionHeader : public Header -{ -public: - WifiMeshActionHeader (); - ~WifiMeshActionHeader (); - - /* Compatible with open80211s implementation */ - enum CategoryValue //table 7-24 staring from 4 - { - MESH_PEERING_MGT = 30, - MESH_LINK_METRIC = 31, - MESH_PATH_SELECTION = 32, - MESH_INTERWORKING = 33, - MESH_RESOURCE_COORDINATION = 34, - MESH_PROXY_FORWARDING = 35, - }; - /* Compatible with open80211s implementation */ - enum PeerLinkMgtActionValue - { - PEER_LINK_OPEN = 0, - PEER_LINK_CONFIRM = 1, - PEER_LINK_CLOSE = 2, - }; - enum LinkMetricActionValue - { - LINK_METRIC_REQUEST = 0, - LINK_METRIC_REPORT, - }; - /* Compatible with open80211s implementation */ - enum PathSelectionActionValue - { - PATH_SELECTION = 0, - }; - enum InterworkActionValue - { - PORTAL_ANNOUNCEMENT = 0, - }; - enum ResourceCoordinationActionValue - { - CONGESTION_CONTROL_NOTIFICATION = 0, - MDA_SETUP_REQUEST, - MDA_SETUP_REPLY, - MDAOP_ADVERTISMENT_REQUEST, - MDAOP_ADVERTISMENTS, - MDAOP_SET_TEARDOWN, - BEACON_TIMING_REQUEST, - BEACON_TIMING_RESPONSE, - TBTT_ADJUSTMENT_REQUEST, - MESH_CHANNEL_SWITCH_ANNOUNCEMENT, - }; - typedef union - { - enum PeerLinkMgtActionValue peerLink; - enum LinkMetricActionValue linkMetrtic; - enum PathSelectionActionValue pathSelection; - enum InterworkActionValue interwork; - enum ResourceCoordinationActionValue resourceCoordination; - } ActionValue; - void SetAction (enum CategoryValue type,ActionValue action); - - CategoryValue GetCategory (); - ActionValue GetAction (); - static TypeId GetTypeId (); - virtual TypeId GetInstanceTypeId () const; - virtual void Print (std::ostream &os) const; - virtual uint32_t GetSerializedSize () const; - virtual void Serialize (Buffer::Iterator start) const; - virtual uint32_t Deserialize (Buffer::Iterator start); -private: - uint8_t m_category; - uint8_t m_actionValue; -}; } //namespace dot11s } // namespace ns3 #endif /* MESH_WIFI_MAC_HEADER_H */ diff --git a/src/devices/mesh/dot11s/hwmp-protocol-mac.cc b/src/devices/mesh/dot11s/hwmp-protocol-mac.cc index ca65e5ed8..3a1338969 100644 --- a/src/devices/mesh/dot11s/hwmp-protocol-mac.cc +++ b/src/devices/mesh/dot11s/hwmp-protocol-mac.cc @@ -23,6 +23,7 @@ #include "ns3/simulator.h" #include "ns3/nstime.h" #include "ns3/log.h" +#include "ns3/mgt-headers.h" #include "dot11s-mac-header.h" #include "hwmp-protocol-mac.h" #include "hwmp-tag.h" @@ -94,10 +95,10 @@ HwmpProtocolMac::ReceiveAction (Ptr packet, const WifiMacHeader & header { m_stats.rxMgt++; m_stats.rxMgtBytes += packet->GetSize (); - WifiMeshActionHeader actionHdr; + WifiActionHeader actionHdr; packet->RemoveHeader (actionHdr); - WifiMeshActionHeader::ActionValue actionValue = actionHdr.GetAction (); - if (actionHdr.GetCategory () != WifiMeshActionHeader::MESH_PATH_SELECTION) + WifiActionHeader::ActionValue actionValue = actionHdr.GetAction (); + if (actionHdr.GetCategory () != WifiActionHeader::MESH_PATH_SELECTION) { return true; } @@ -203,13 +204,13 @@ HwmpProtocolMac::UpdateOutcomingFrame (Ptr packet, WifiMacHeader & heade header.SetAddr1 (tag.GetAddress ()); return true; } -WifiMeshActionHeader -HwmpProtocolMac::GetWifiMeshActionHeader () +WifiActionHeader +HwmpProtocolMac::GetWifiActionHeader () { - WifiMeshActionHeader actionHdr; - WifiMeshActionHeader::ActionValue action; - action.pathSelection = WifiMeshActionHeader::PATH_SELECTION; - actionHdr.SetAction (WifiMeshActionHeader::MESH_PATH_SELECTION, action); + WifiActionHeader actionHdr; + WifiActionHeader::ActionValue action; + action.pathSelection = WifiActionHeader::PATH_SELECTION; + actionHdr.SetAction (WifiActionHeader::MESH_PATH_SELECTION, action); return actionHdr; } void @@ -230,7 +231,7 @@ HwmpProtocolMac::SendPreq (std::vector preq) elements.AddInformationElement(Ptr (&(*i))); } packet->AddHeader(elements); - packet->AddHeader (GetWifiMeshActionHeader ()); + packet->AddHeader (GetWifiActionHeader ()); //create 802.11 header: WifiMacHeader hdr; hdr.SetAction (); @@ -300,7 +301,7 @@ HwmpProtocolMac::SendPrep (IePrep prep, Mac48Address receiver) WifiInformationElementVector elements; elements.AddInformationElement(Ptr (&prep)); packet->AddHeader (elements); - packet->AddHeader (GetWifiMeshActionHeader ()); + packet->AddHeader (GetWifiActionHeader ()); //create 802.11 header: WifiMacHeader hdr; hdr.SetAction (); @@ -341,7 +342,7 @@ HwmpProtocolMac::ForwardPerr (std::vector faile elements.AddInformationElement(perr); } packet->AddHeader (elements); - packet->AddHeader (GetWifiMeshActionHeader ()); + packet->AddHeader (GetWifiActionHeader ()); //create 802.11 header: WifiMacHeader hdr; hdr.SetAction (); diff --git a/src/devices/mesh/dot11s/hwmp-protocol-mac.h b/src/devices/mesh/dot11s/hwmp-protocol-mac.h index 2bc8c080f..76fafe8b6 100644 --- a/src/devices/mesh/dot11s/hwmp-protocol-mac.h +++ b/src/devices/mesh/dot11s/hwmp-protocol-mac.h @@ -27,11 +27,11 @@ namespace ns3 { class MeshWifiInterfaceMac; +class WifiActionHeader; namespace dot11s { class HwmpProtocol; -class WifiMeshActionHeader; class IePreq; class IePrep; class IePerr; @@ -58,7 +58,7 @@ public: private: friend class HwmpProtocol; ///\returns a path selection action header - static WifiMeshActionHeader GetWifiMeshActionHeader (); + static WifiActionHeader GetWifiActionHeader (); ///\name Intercation with HWMP: //\{ void SendPreq (IePreq preq); diff --git a/src/devices/mesh/dot11s/peer-link-frame.cc b/src/devices/mesh/dot11s/peer-link-frame.cc index 607557966..65b079316 100644 --- a/src/devices/mesh/dot11s/peer-link-frame.cc +++ b/src/devices/mesh/dot11s/peer-link-frame.cc @@ -43,23 +43,23 @@ PeerLinkFrameStart::SetPlinkFrameStart (PeerLinkFrameStart::PlinkFrameStartField { m_subtype = fields.subtype; m_protocol = fields.protocol; - if (m_subtype != (uint8_t) (WifiMeshActionHeader::PEER_LINK_CLOSE)) + if (m_subtype != (uint8_t) (WifiActionHeader::PEER_LINK_CLOSE)) { m_capability = fields.capability; } - if (m_subtype == (uint8_t) (WifiMeshActionHeader::PEER_LINK_CONFIRM)) + if (m_subtype == (uint8_t) (WifiActionHeader::PEER_LINK_CONFIRM)) { m_aid = fields.aid; } - if (m_subtype != (uint8_t) (WifiMeshActionHeader::PEER_LINK_CLOSE)) + if (m_subtype != (uint8_t) (WifiActionHeader::PEER_LINK_CLOSE)) { m_rates = fields.rates; } - if (m_subtype != (uint8_t) (WifiMeshActionHeader::PEER_LINK_CONFIRM)) + if (m_subtype != (uint8_t) (WifiActionHeader::PEER_LINK_CONFIRM)) { m_meshId = fields.meshId; } - if (m_subtype != (uint8_t) (WifiMeshActionHeader::PEER_LINK_CLOSE)) + if (m_subtype != (uint8_t) (WifiActionHeader::PEER_LINK_CLOSE)) { m_config = fields.config; } @@ -109,23 +109,23 @@ PeerLinkFrameStart::GetSerializedSize () const { uint32_t size = 3; //Peering protocol NS_ASSERT (m_subtype < 3); - if ((uint8_t) (WifiMeshActionHeader::PEER_LINK_CLOSE) != m_subtype) + if ((uint8_t) (WifiActionHeader::PEER_LINK_CLOSE) != m_subtype) { size += 2; //capability } - if ((uint8_t) (WifiMeshActionHeader::PEER_LINK_CONFIRM) == m_subtype) + if ((uint8_t) (WifiActionHeader::PEER_LINK_CONFIRM) == m_subtype) { size += 2; //AID of remote peer } - if ((uint8_t) (WifiMeshActionHeader::PEER_LINK_CLOSE) != m_subtype) + if ((uint8_t) (WifiActionHeader::PEER_LINK_CLOSE) != m_subtype) { size += m_rates.GetSerializedSize (); } - if ((uint8_t) (WifiMeshActionHeader::PEER_LINK_CONFIRM) != m_subtype) + if ((uint8_t) (WifiActionHeader::PEER_LINK_CONFIRM) != m_subtype) { size += m_meshId.GetInformationSize () + 2; } - if ((uint8_t) (WifiMeshActionHeader::PEER_LINK_CLOSE) != m_subtype) + if ((uint8_t) (WifiActionHeader::PEER_LINK_CLOSE) != m_subtype) { size += m_config.GetInformationSize () + 2; } @@ -144,26 +144,26 @@ PeerLinkFrameStart::Serialize (Buffer::Iterator start) const i.WriteU8 (m_protocol.GetInformationSize ()); m_protocol.SerializeInformation (i); i.Next (m_protocol.GetInformationSize ()); - if ((uint8_t) (WifiMeshActionHeader::PEER_LINK_CLOSE) != m_subtype) + if ((uint8_t) (WifiActionHeader::PEER_LINK_CLOSE) != m_subtype) { i.WriteHtolsbU16 (m_capability); } - if ((uint8_t) (WifiMeshActionHeader::PEER_LINK_CONFIRM) == m_subtype) + if ((uint8_t) (WifiActionHeader::PEER_LINK_CONFIRM) == m_subtype) { i.WriteHtolsbU16 (m_aid); } - if ((uint8_t) (WifiMeshActionHeader::PEER_LINK_CLOSE) != m_subtype) + if ((uint8_t) (WifiActionHeader::PEER_LINK_CLOSE) != m_subtype) { i = m_rates.Serialize (i); } - if ((uint8_t) (WifiMeshActionHeader::PEER_LINK_CONFIRM) != m_subtype) + if ((uint8_t) (WifiActionHeader::PEER_LINK_CONFIRM) != m_subtype) { i.WriteU8 (IE11S_MESH_ID); i.WriteU8 (m_meshId.GetInformationSize ()); m_meshId.SerializeInformation (i); i.Next (m_meshId.GetInformationSize ()); } - if ((uint8_t) (WifiMeshActionHeader::PEER_LINK_CLOSE) != m_subtype) + if ((uint8_t) (WifiActionHeader::PEER_LINK_CLOSE) != m_subtype) { i.WriteU8 (IE11S_MESH_CONFIGURATION); i.WriteU8 (m_config.GetInformationSize ()); @@ -190,19 +190,19 @@ PeerLinkFrameStart::Deserialize (Buffer::Iterator start) } i.Next (m_protocol.GetInformationSize ()); } - if ((uint8_t) (WifiMeshActionHeader::PEER_LINK_CLOSE) != m_subtype) + if ((uint8_t) (WifiActionHeader::PEER_LINK_CLOSE) != m_subtype) { m_capability = i.ReadLsbtohU16 (); } - if ((uint8_t) (WifiMeshActionHeader::PEER_LINK_CONFIRM) == m_subtype) + if ((uint8_t) (WifiActionHeader::PEER_LINK_CONFIRM) == m_subtype) { m_aid = i.ReadLsbtohU16 (); } - if ((uint8_t) (WifiMeshActionHeader::PEER_LINK_CLOSE) != m_subtype) + if ((uint8_t) (WifiActionHeader::PEER_LINK_CLOSE) != m_subtype) { i = m_rates.Deserialize (i); } - if ((uint8_t) (WifiMeshActionHeader::PEER_LINK_CONFIRM) != m_subtype) + if ((uint8_t) (WifiActionHeader::PEER_LINK_CONFIRM) != m_subtype) { uint8_t id = i.ReadU8 (); uint8_t length = i.ReadU8 (); @@ -213,7 +213,7 @@ PeerLinkFrameStart::Deserialize (Buffer::Iterator start) } i.Next (m_meshId.GetInformationSize ()); } - if ((uint8_t) (WifiMeshActionHeader::PEER_LINK_CLOSE) != m_subtype) + if ((uint8_t) (WifiActionHeader::PEER_LINK_CLOSE) != m_subtype) { uint8_t id = i.ReadU8 (); uint8_t length = i.ReadU8 (); diff --git a/src/devices/mesh/dot11s/peer-management-protocol-mac.cc b/src/devices/mesh/dot11s/peer-management-protocol-mac.cc index c7ab70a38..d23c502c5 100644 --- a/src/devices/mesh/dot11s/peer-management-protocol-mac.cc +++ b/src/devices/mesh/dot11s/peer-management-protocol-mac.cc @@ -84,11 +84,11 @@ PeerManagementProtocolMac::Receive (Ptr const_packet, const WifiMacHeade } if (header.IsAction ()) { - WifiMeshActionHeader actionHdr; + WifiActionHeader actionHdr; packet->RemoveHeader (actionHdr); - WifiMeshActionHeader::ActionValue actionValue = actionHdr.GetAction (); + WifiActionHeader::ActionValue actionValue = actionHdr.GetAction (); // If can not handle - just return; - if (actionHdr.GetCategory () != WifiMeshActionHeader::MESH_PEERING_MGT) + if (actionHdr.GetCategory () != WifiActionHeader::MESH_PEERING_MGT) { return m_protocol->IsActiveLink (m_ifIndex, header.GetAddr2 ()); } @@ -104,7 +104,7 @@ PeerManagementProtocolMac::Receive (Ptr const_packet, const WifiMacHeade fields = peerFrame.GetFields (); NS_ASSERT (fields.subtype == actionValue.peerLink); } - if ((actionValue.peerLink != WifiMeshActionHeader::PEER_LINK_CLOSE) && !(m_parent->CheckSupportedRates ( + if ((actionValue.peerLink != WifiActionHeader::PEER_LINK_CLOSE) && !(m_parent->CheckSupportedRates ( fields.rates))) { m_protocol->ConfigurationMismatch (m_ifIndex, peerAddress); @@ -112,7 +112,7 @@ PeerManagementProtocolMac::Receive (Ptr const_packet, const WifiMacHeade m_stats.brokenMgt++; return false; } - if ((actionValue.peerLink != WifiMeshActionHeader::PEER_LINK_CONFIRM) && !fields.meshId.IsEqual ( + if ((actionValue.peerLink != WifiActionHeader::PEER_LINK_CONFIRM) && !fields.meshId.IsEqual ( *(m_protocol->GetMeshId ()))) { m_protocol->ConfigurationMismatch (m_ifIndex, peerAddress); @@ -130,17 +130,17 @@ PeerManagementProtocolMac::Receive (Ptr const_packet, const WifiMacHeade if (peerElement->SubtypeIsOpen ()) { m_stats.rxOpen++; - NS_ASSERT (actionValue.peerLink == WifiMeshActionHeader::PEER_LINK_OPEN); + NS_ASSERT (actionValue.peerLink == WifiActionHeader::PEER_LINK_OPEN); } if (peerElement->SubtypeIsConfirm ()) { m_stats.rxConfirm++; - NS_ASSERT (actionValue.peerLink == WifiMeshActionHeader::PEER_LINK_CONFIRM); + NS_ASSERT (actionValue.peerLink == WifiActionHeader::PEER_LINK_CONFIRM); } if (peerElement->SubtypeIsClose ()) { m_stats.rxClose++; - NS_ASSERT (actionValue.peerLink == WifiMeshActionHeader::PEER_LINK_CLOSE); + NS_ASSERT (actionValue.peerLink == WifiActionHeader::PEER_LINK_CLOSE); } //Deliver Peer link management frame to protocol: m_protocol->ReceivePeerLinkFrame (m_ifIndex, peerAddress, peerMpAddress, fields.aid, *peerElement, @@ -156,10 +156,10 @@ PeerManagementProtocolMac::UpdateOutcomingFrame (Ptr packet, WifiMacHead { if (header.IsAction ()) { - WifiMeshActionHeader actionHdr; + WifiActionHeader actionHdr; packet->PeekHeader (actionHdr); - WifiMeshActionHeader::ActionValue actionValue = actionHdr.GetAction (); - if (actionHdr.GetCategory () == WifiMeshActionHeader::MESH_PEERING_MGT) + WifiActionHeader::ActionValue actionValue = actionHdr.GetAction (); + if (actionHdr.GetCategory () == WifiActionHeader::MESH_PEERING_MGT) { return true; } @@ -211,32 +211,32 @@ PeerManagementProtocolMac::SendPeerLinkManagementFrame (Mac48Address peerAddress PeerLinkFrameStart plinkFrame; //Create an 802.11 frame header: //Send management frame to MAC: - WifiMeshActionHeader actionHdr; + WifiActionHeader actionHdr; if (peerElement.SubtypeIsOpen ()) { m_stats.txOpen++; - WifiMeshActionHeader::ActionValue action; - action.peerLink = WifiMeshActionHeader::PEER_LINK_OPEN; - fields.subtype = WifiMeshActionHeader::PEER_LINK_OPEN; - actionHdr.SetAction (WifiMeshActionHeader::MESH_PEERING_MGT, action); + WifiActionHeader::ActionValue action; + action.peerLink = WifiActionHeader::PEER_LINK_OPEN; + fields.subtype = WifiActionHeader::PEER_LINK_OPEN; + actionHdr.SetAction (WifiActionHeader::MESH_PEERING_MGT, action); } if (peerElement.SubtypeIsConfirm ()) { m_stats.txConfirm++; - WifiMeshActionHeader::ActionValue action; - action.peerLink = WifiMeshActionHeader::PEER_LINK_CONFIRM; + WifiActionHeader::ActionValue action; + action.peerLink = WifiActionHeader::PEER_LINK_CONFIRM; fields.aid = aid; - fields.subtype = WifiMeshActionHeader::PEER_LINK_CONFIRM; - actionHdr.SetAction (WifiMeshActionHeader::MESH_PEERING_MGT, action); + fields.subtype = WifiActionHeader::PEER_LINK_CONFIRM; + actionHdr.SetAction (WifiActionHeader::MESH_PEERING_MGT, action); } if (peerElement.SubtypeIsClose ()) { m_stats.txClose++; - WifiMeshActionHeader::ActionValue action; - action.peerLink = WifiMeshActionHeader::PEER_LINK_CLOSE; - fields.subtype = WifiMeshActionHeader::PEER_LINK_CLOSE; + WifiActionHeader::ActionValue action; + action.peerLink = WifiActionHeader::PEER_LINK_CLOSE; + fields.subtype = WifiActionHeader::PEER_LINK_CLOSE; fields.reasonCode = peerElement.GetReasonCode (); - actionHdr.SetAction (WifiMeshActionHeader::MESH_PEERING_MGT, action); + actionHdr.SetAction (WifiActionHeader::MESH_PEERING_MGT, action); } plinkFrame.SetPlinkFrameStart (fields); packet->AddHeader (plinkFrame); diff --git a/src/devices/mesh/dot11s/test/dot11s-test-suite.cc b/src/devices/mesh/dot11s/test/dot11s-test-suite.cc index fcca8a33f..907469366 100644 --- a/src/devices/mesh/dot11s/test/dot11s-test-suite.cc +++ b/src/devices/mesh/dot11s/test/dot11s-test-suite.cc @@ -20,6 +20,7 @@ #include "ns3/test.h" #include "ns3/packet.h" #include "ns3/simulator.h" +#include "ns3/mgt-headers.h" #include "../dot11s-mac-header.h" #include "../hwmp-rtable.h" #include "../peer-link-frame.h" @@ -225,7 +226,7 @@ PeerLinkFrameStartTest::DoRun () { PeerLinkFrameStart a; PeerLinkFrameStart::PlinkFrameStartFields fields; - fields.subtype = (uint8_t) (WifiMeshActionHeader::PEER_LINK_OPEN); + fields.subtype = (uint8_t) (WifiActionHeader::PEER_LINK_OPEN); fields.capability = 0; fields.aid = 101; fields.reasonCode = 12; @@ -234,14 +235,14 @@ PeerLinkFrameStartTest::DoRun () Ptr packet = Create (); packet->AddHeader (a); PeerLinkFrameStart b; - b.SetPlinkFrameSubtype ((uint8_t) (WifiMeshActionHeader::PEER_LINK_OPEN)); + b.SetPlinkFrameSubtype ((uint8_t) (WifiActionHeader::PEER_LINK_OPEN)); packet->RemoveHeader (b); NS_TEST_EXPECT_MSG_EQ (a, b, "PEER_LINK_OPEN works"); } { PeerLinkFrameStart a; PeerLinkFrameStart::PlinkFrameStartFields fields; - fields.subtype = (uint8_t) (WifiMeshActionHeader::PEER_LINK_CONFIRM); + fields.subtype = (uint8_t) (WifiActionHeader::PEER_LINK_CONFIRM); fields.capability = 0; fields.aid = 1234; fields.reasonCode = 12; @@ -250,14 +251,14 @@ PeerLinkFrameStartTest::DoRun () Ptr packet = Create (); packet->AddHeader (a); PeerLinkFrameStart b; - b.SetPlinkFrameSubtype ((uint8_t) (WifiMeshActionHeader::PEER_LINK_CONFIRM)); + b.SetPlinkFrameSubtype ((uint8_t) (WifiActionHeader::PEER_LINK_CONFIRM)); packet->RemoveHeader (b); NS_TEST_EXPECT_MSG_EQ (a, b, "PEER_LINK_CONFIRM works"); } { PeerLinkFrameStart a; PeerLinkFrameStart::PlinkFrameStartFields fields; - fields.subtype = (uint8_t) (WifiMeshActionHeader::PEER_LINK_CLOSE); + fields.subtype = (uint8_t) (WifiActionHeader::PEER_LINK_CLOSE); fields.capability = 0; fields.aid = 10; fields.meshId = IeMeshId ("qqq"); @@ -266,7 +267,7 @@ PeerLinkFrameStartTest::DoRun () Ptr packet = Create (); packet->AddHeader (a); PeerLinkFrameStart b; - b.SetPlinkFrameSubtype ((uint8_t) (WifiMeshActionHeader::PEER_LINK_CLOSE)); + b.SetPlinkFrameSubtype ((uint8_t) (WifiActionHeader::PEER_LINK_CLOSE)); packet->RemoveHeader (b); NS_TEST_EXPECT_MSG_EQ (a, b, "PEER_LINK_CLOSE works"); } diff --git a/src/devices/mesh/dot11s/test/hwmp-target-flags-regression.cc b/src/devices/mesh/dot11s/test/hwmp-target-flags-regression.cc index 1f267ce77..f79a3ddd7 100644 --- a/src/devices/mesh/dot11s/test/hwmp-target-flags-regression.cc +++ b/src/devices/mesh/dot11s/test/hwmp-target-flags-regression.cc @@ -42,7 +42,7 @@ const bool WRITE_VECTORS = false; const char * const PREFIX = "hwmp-target-flags-regression-test"; -HwmpDoRfRegressionTest::HwmpDoRfRegressionTest () : TestCase ("HWMP proactive regression test"), +HwmpDoRfRegressionTest::HwmpDoRfRegressionTest () : TestCase ("HWMP target flags regression test"), m_nodes (0), m_time (Seconds (5)) { diff --git a/src/devices/wifi/mgt-headers.cc b/src/devices/wifi/mgt-headers.cc index 83668c120..dfcb2d0cc 100644 --- a/src/devices/wifi/mgt-headers.cc +++ b/src/devices/wifi/mgt-headers.cc @@ -388,5 +388,144 @@ MgtAssocResponseHeader::Deserialize (Buffer::Iterator start) i = m_rates.Deserialize (i); return i.GetDistanceFrom (start); } +/********************************************************** + * ActionFrame + **********************************************************/ +WifiActionHeader::WifiActionHeader () +{ +} +WifiActionHeader::~WifiActionHeader () +{ +} +void +WifiActionHeader::SetAction (WifiActionHeader::CategoryValue type, + WifiActionHeader::ActionValue action) +{ + m_category = type; + + switch (type) + { + case MESH_PEERING_MGT: + { + m_actionValue = action.peerLink; + break; + } + case MESH_PATH_SELECTION: + { + m_actionValue = action.pathSelection; + break; + } + case MESH_LINK_METRIC: + case MESH_INTERWORKING: + case MESH_RESOURCE_COORDINATION: + case MESH_PROXY_FORWARDING: + break; + } +} +WifiActionHeader::CategoryValue +WifiActionHeader::GetCategory () +{ + switch (m_category) + { + case MESH_PEERING_MGT: + return MESH_PEERING_MGT; + case MESH_LINK_METRIC: + return MESH_LINK_METRIC; + case MESH_PATH_SELECTION: + return MESH_PATH_SELECTION; + case MESH_INTERWORKING: + return MESH_INTERWORKING; + case MESH_RESOURCE_COORDINATION: + return MESH_RESOURCE_COORDINATION; + case MESH_PROXY_FORWARDING: + return MESH_PROXY_FORWARDING; + default: + NS_FATAL_ERROR ("Unknown action value"); + return MESH_PEERING_MGT; + } +} +WifiActionHeader::ActionValue +WifiActionHeader::GetAction () +{ + ActionValue retval; + retval.peerLink = PEER_LINK_OPEN; // Needs to be initialized to something to quiet valgrind in default cases + switch (m_category) + { + case MESH_PEERING_MGT: + switch (m_actionValue) + { + case PEER_LINK_OPEN: + retval.peerLink = PEER_LINK_OPEN; + return retval; + case PEER_LINK_CONFIRM: + retval.peerLink = PEER_LINK_CONFIRM; + return retval; + case PEER_LINK_CLOSE: + retval.peerLink = PEER_LINK_CLOSE; + return retval; + default: + NS_FATAL_ERROR ("Unknown mesh peering management action code"); + retval.peerLink = PEER_LINK_OPEN; /* quiet compiler */ + return retval; + } + case MESH_PATH_SELECTION: + switch (m_actionValue) + { + case PATH_SELECTION: + retval.pathSelection = PATH_SELECTION; + return retval; + default: + NS_FATAL_ERROR ("Unknown mesh path selection action code"); + retval.peerLink = PEER_LINK_OPEN; /* quiet compiler */ + return retval; + } + case MESH_LINK_METRIC: + // not yet supported + case MESH_INTERWORKING: + // not yet supported + case MESH_RESOURCE_COORDINATION: + // not yet supported + default: + NS_FATAL_ERROR ("Unsupported mesh action"); + retval.peerLink = PEER_LINK_OPEN; /* quiet compiler */ + return retval; + } +} +TypeId +WifiActionHeader::GetTypeId () +{ + static TypeId tid = TypeId ("ns3::WifiActionHeader") + .SetParent
() + .AddConstructor (); + return tid; +} +TypeId +WifiActionHeader::GetInstanceTypeId () const +{ + return GetTypeId (); +} +void +WifiActionHeader::Print (std::ostream &os) const +{ +} +uint32_t +WifiActionHeader::GetSerializedSize () const +{ + return 2; +} +void +WifiActionHeader::Serialize (Buffer::Iterator start) const +{ + start.WriteU8 (m_category); + start.WriteU8 (m_actionValue); +} +uint32_t +WifiActionHeader::Deserialize (Buffer::Iterator start) +{ + Buffer::Iterator i = start; + m_category = i.ReadU8 (); + m_actionValue = i.ReadU8 (); + return i.GetDistanceFrom (start); +} } // namespace ns3 diff --git a/src/devices/wifi/mgt-headers.h b/src/devices/wifi/mgt-headers.h index 44cf60aed..6a04c8ffb 100644 --- a/src/devices/wifi/mgt-headers.h +++ b/src/devices/wifi/mgt-headers.h @@ -134,6 +134,84 @@ private: class MgtBeaconHeader : public MgtProbeResponseHeader {}; +/** + * \brief See IEEE 802.11 chapter 7.3.1.11 + * + * Header format: | category: 1 | action value: 1 | + */ +class WifiActionHeader : public Header +{ +public: + WifiActionHeader (); + ~WifiActionHeader (); + + /* Compatible with open80211s implementation */ + enum CategoryValue //table 7-24 staring from 4 + { + MESH_PEERING_MGT = 30, + MESH_LINK_METRIC = 31, + MESH_PATH_SELECTION = 32, + MESH_INTERWORKING = 33, + MESH_RESOURCE_COORDINATION = 34, + MESH_PROXY_FORWARDING = 35, + }; + /* Compatible with open80211s implementation */ + enum PeerLinkMgtActionValue + { + PEER_LINK_OPEN = 0, + PEER_LINK_CONFIRM = 1, + PEER_LINK_CLOSE = 2, + }; + enum LinkMetricActionValue + { + LINK_METRIC_REQUEST = 0, + LINK_METRIC_REPORT, + }; + /* Compatible with open80211s implementation */ + enum PathSelectionActionValue + { + PATH_SELECTION = 0, + }; + enum InterworkActionValue + { + PORTAL_ANNOUNCEMENT = 0, + }; + enum ResourceCoordinationActionValue + { + CONGESTION_CONTROL_NOTIFICATION = 0, + MDA_SETUP_REQUEST, + MDA_SETUP_REPLY, + MDAOP_ADVERTISMENT_REQUEST, + MDAOP_ADVERTISMENTS, + MDAOP_SET_TEARDOWN, + BEACON_TIMING_REQUEST, + BEACON_TIMING_RESPONSE, + TBTT_ADJUSTMENT_REQUEST, + MESH_CHANNEL_SWITCH_ANNOUNCEMENT, + }; + typedef union + { + enum PeerLinkMgtActionValue peerLink; + enum LinkMetricActionValue linkMetrtic; + enum PathSelectionActionValue pathSelection; + enum InterworkActionValue interwork; + enum ResourceCoordinationActionValue resourceCoordination; + } ActionValue; + void SetAction (enum CategoryValue type,ActionValue action); + + CategoryValue GetCategory (); + ActionValue GetAction (); + static TypeId GetTypeId (); + virtual TypeId GetInstanceTypeId () const; + virtual void Print (std::ostream &os) const; + virtual uint32_t GetSerializedSize () const; + virtual void Serialize (Buffer::Iterator start) const; + virtual uint32_t Deserialize (Buffer::Iterator start); +private: + uint8_t m_category; + uint8_t m_actionValue; +}; + } // namespace ns3