Mesh: action header moved from dot11s namespace and placed to
authorKirill Andreev <andreev@iitp.ru>
Tue, 01 Dec 2009 15:05:31 +0300
changeset 5824 5abf274b52d4
parent 5823 a61b59819f10
child 5825 9e8c8a54772b
Mesh: action header moved from dot11s namespace and placed to wifi/mgt-headers.h
src/devices/mesh/dot11s/dot11s-mac-header.cc
src/devices/mesh/dot11s/dot11s-mac-header.h
src/devices/mesh/dot11s/hwmp-protocol-mac.cc
src/devices/mesh/dot11s/hwmp-protocol-mac.h
src/devices/mesh/dot11s/peer-link-frame.cc
src/devices/mesh/dot11s/peer-management-protocol-mac.cc
src/devices/mesh/dot11s/test/dot11s-test-suite.cc
src/devices/mesh/dot11s/test/hwmp-target-flags-regression.cc
src/devices/wifi/mgt-headers.cc
src/devices/wifi/mgt-headers.h
--- a/src/devices/mesh/dot11s/dot11s-mac-header.cc	Mon Nov 30 18:30:25 2009 -0800
+++ b/src/devices/mesh/dot11s/dot11s-mac-header.cc	Tue Dec 01 15:05:31 2009 +0300
@@ -174,145 +174,5 @@
       && (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<Header> ()
-  .AddConstructor<WifiMeshActionHeader> ();
-  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
--- a/src/devices/mesh/dot11s/dot11s-mac-header.h	Mon Nov 30 18:30:25 2009 -0800
+++ b/src/devices/mesh/dot11s/dot11s-mac-header.h	Tue Dec 01 15:05:31 2009 +0300
@@ -73,85 +73,6 @@
 };
 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 */
--- a/src/devices/mesh/dot11s/hwmp-protocol-mac.cc	Mon Nov 30 18:30:25 2009 -0800
+++ b/src/devices/mesh/dot11s/hwmp-protocol-mac.cc	Tue Dec 01 15:05:31 2009 +0300
@@ -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 @@
 {
   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 @@
   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 @@
       elements.AddInformationElement(Ptr<IePreq> (&(*i)));
     }
   packet->AddHeader(elements);
-  packet->AddHeader (GetWifiMeshActionHeader ());
+  packet->AddHeader (GetWifiActionHeader ());
   //create 802.11 header:
   WifiMacHeader hdr;
   hdr.SetAction ();
@@ -300,7 +301,7 @@
   WifiInformationElementVector elements;
   elements.AddInformationElement(Ptr<IePrep> (&prep));
   packet->AddHeader (elements);
-  packet->AddHeader (GetWifiMeshActionHeader ());
+  packet->AddHeader (GetWifiActionHeader ());
   //create 802.11 header:
   WifiMacHeader hdr;
   hdr.SetAction ();
@@ -341,7 +342,7 @@
       elements.AddInformationElement(perr);
     }
   packet->AddHeader (elements);
-  packet->AddHeader (GetWifiMeshActionHeader ());
+  packet->AddHeader (GetWifiActionHeader ());
   //create 802.11 header:
   WifiMacHeader hdr;
   hdr.SetAction ();
--- a/src/devices/mesh/dot11s/hwmp-protocol-mac.h	Mon Nov 30 18:30:25 2009 -0800
+++ b/src/devices/mesh/dot11s/hwmp-protocol-mac.h	Tue Dec 01 15:05:31 2009 +0300
@@ -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 @@
 private:
   friend class HwmpProtocol;
   ///\returns a path selection action header
-  static WifiMeshActionHeader GetWifiMeshActionHeader ();
+  static WifiActionHeader GetWifiActionHeader ();
   ///\name Intercation with HWMP:
   //\{
   void SendPreq (IePreq preq);
--- a/src/devices/mesh/dot11s/peer-link-frame.cc	Mon Nov 30 18:30:25 2009 -0800
+++ b/src/devices/mesh/dot11s/peer-link-frame.cc	Tue Dec 01 15:05:31 2009 +0300
@@ -43,23 +43,23 @@
 {
   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 @@
 {
   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 @@
   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 @@
         }
       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 @@
         }
       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 ();
--- a/src/devices/mesh/dot11s/peer-management-protocol-mac.cc	Mon Nov 30 18:30:25 2009 -0800
+++ b/src/devices/mesh/dot11s/peer-management-protocol-mac.cc	Tue Dec 01 15:05:31 2009 +0300
@@ -84,11 +84,11 @@
     }
   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 @@
           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 @@
           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 @@
       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 @@
 {
   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 @@
   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);
--- a/src/devices/mesh/dot11s/test/dot11s-test-suite.cc	Mon Nov 30 18:30:25 2009 -0800
+++ b/src/devices/mesh/dot11s/test/dot11s-test-suite.cc	Tue Dec 01 15:05:31 2009 +0300
@@ -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 @@
   {
     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 @@
     Ptr<Packet> packet = Create<Packet> ();
     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 @@
     Ptr<Packet> packet = Create<Packet> ();
     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 @@
     Ptr<Packet> packet = Create<Packet> ();
     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");
   }
--- a/src/devices/mesh/dot11s/test/hwmp-target-flags-regression.cc	Mon Nov 30 18:30:25 2009 -0800
+++ b/src/devices/mesh/dot11s/test/hwmp-target-flags-regression.cc	Tue Dec 01 15:05:31 2009 +0300
@@ -42,7 +42,7 @@
 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))
 {
--- a/src/devices/wifi/mgt-headers.cc	Mon Nov 30 18:30:25 2009 -0800
+++ b/src/devices/wifi/mgt-headers.cc	Tue Dec 01 15:05:31 2009 +0300
@@ -388,5 +388,144 @@
   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<Header> ()
+  .AddConstructor<WifiActionHeader> ();
+  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
--- a/src/devices/wifi/mgt-headers.h	Mon Nov 30 18:30:25 2009 -0800
+++ b/src/devices/wifi/mgt-headers.h	Tue Dec 01 15:05:31 2009 +0300
@@ -134,6 +134,84 @@
 
 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