src/devices/mesh/dot11s/peer-link-frame.cc
changeset 4957 3ce177c38776
parent 4920 fbd04c749aaa
child 4973 59b050ada622
--- a/src/devices/mesh/dot11s/peer-link-frame.cc	Thu Apr 09 18:52:20 2009 +0400
+++ b/src/devices/mesh/dot11s/peer-link-frame.cc	Fri Apr 10 12:41:10 2009 +0400
@@ -20,37 +20,58 @@
 
 #include "peer-link-frame.h"
 #include "ns3/mesh-wifi-interface-mac.h"
+#include "ns3/test.h"
+#include "ns3/packet.h"
 namespace ns3 {
 namespace dot11s {
 NS_OBJECT_ENSURE_REGISTERED (PeerLinkFrameStart);
 
-PeerLinkFrameStart::PeerLinkFrameStart ()
+PeerLinkFrameStart::PeerLinkFrameStart ():
+  m_subtype (255),
+  m_aid (0),
+  m_rates (SupportedRates()),
+  m_meshId (Ssid())
 {
-  m_fields.subtype = IePeerManagement::PEER_OPEN;
-  m_fields.aid = 0;
-  m_fields.rates = SupportedRates();
-  m_fields.meshId = Ssid();
+}
+void
+PeerLinkFrameStart::SetPlinkFrameSubtype(uint8_t subtype)
+{
+  m_subtype = subtype;
 }
 void
 PeerLinkFrameStart::SetPlinkFrameStart(PeerLinkFrameStart::PlinkFrameStartFields fields)
 {
-  m_fields = fields;
+  m_subtype = fields.subtype;
+  if(m_subtype == (uint8_t)(WifiMeshMultihopActionHeader::PEER_LINK_CONFIRM))
+    m_aid = fields.aid;
+  if(m_subtype != (uint8_t)(WifiMeshMultihopActionHeader::PEER_LINK_CLOSE))
+  {
+    m_rates = fields.rates;
+    m_meshId = fields.meshId;
+  }
+  else
+    m_reasonCode = fields.reasonCode;
 }
 
 PeerLinkFrameStart::PlinkFrameStartFields
 PeerLinkFrameStart::GetFields ()
 {
-  return m_fields;
+  PlinkFrameStartFields retval;
+  retval.subtype = m_subtype;
+  retval.aid = m_aid;
+  retval.rates = m_rates;
+  retval.meshId = m_meshId;
+  return retval;
 }
 
 bool
 PeerLinkFrameStart::CheckPlinkFrameStart(Ptr<MeshWifiInterfaceMac> mac)
 {
   bool retval;
-  retval = mac->CheckSupportedRates(m_fields.rates);
+  retval = mac->CheckSupportedRates(m_rates);
   if(! retval)
     return retval;
-  retval = mac->CheckMeshId(m_fields.meshId);
+  retval = mac->CheckMeshId(m_meshId);
   return true;
 }
 
@@ -73,21 +94,27 @@
 void
 PeerLinkFrameStart::Print (std::ostream &os) const
 {
-  //TODO:fill this method
+  os << "subtype = " << (uint16_t)m_subtype
+  << "\naid = " << (uint16_t)m_aid
+  << "\nrates = " << m_rates
+  << "\nmeshId = " << m_meshId;
 }
 
 uint32_t
 PeerLinkFrameStart::GetSerializedSize () const
 {
-  uint32_t size = 1; //Subtype
-  if (IePeerManagement::PEER_CONFIRM == m_fields.subtype)
+  uint32_t size = 0;
+  NS_ASSERT(m_subtype < 3);
+  if ((uint8_t)(WifiMeshMultihopActionHeader::PEER_LINK_CONFIRM) == m_subtype)
     size += 2; //AID of remote peer
-  if (IePeerManagement::PEER_CLOSE != m_fields.subtype)
+  if ((uint8_t)(WifiMeshMultihopActionHeader::PEER_LINK_CLOSE) != m_subtype)
     {
-      size += m_fields.rates.GetSerializedSize ();
+      size += m_rates.GetSerializedSize ();
       size += 2;
-      size += m_fields.meshId.GetSerializedSize ();
+      size += m_meshId.GetSerializedSize ();
     }
+  else
+    size += 2; //reasonCode
   return size;
 }
 
@@ -95,33 +122,109 @@
 PeerLinkFrameStart::Serialize (Buffer::Iterator start) const
 {
   Buffer::Iterator i = start;
-  i.WriteU8 (m_fields.subtype); //Like a Category in Standart
-  if (IePeerManagement::PEER_CONFIRM == m_fields.subtype)
-    i.WriteHtonU16 (m_fields.aid);
-  if (IePeerManagement::PEER_CLOSE != m_fields.subtype)
+  NS_ASSERT(m_subtype < 3);
+  //i.WriteU8 (m_subtype);
+  if ((uint8_t)(WifiMeshMultihopActionHeader::PEER_LINK_CONFIRM) == m_subtype)
+    i.WriteHtonU16 (m_aid);
+  if ((uint8_t)(WifiMeshMultihopActionHeader::PEER_LINK_CLOSE) != m_subtype)
     {
-      i = m_fields.rates.Serialize (i);
+      i = m_rates.Serialize (i);
       i.Next(2); //QoS
-      i = m_fields.meshId.Serialize (i);
+      i = m_meshId.Serialize (i);
     }
+  else
+    i.WriteHtonU16(m_reasonCode);
 }
 
 uint32_t
 PeerLinkFrameStart::Deserialize (Buffer::Iterator start)
 {
   Buffer::Iterator i = start;
-  m_fields.subtype = (IePeerManagement::Subtype)i.ReadU8 ();
-  if (IePeerManagement::PEER_CONFIRM == m_fields.subtype)
-    m_fields.aid = i.ReadNtohU16 ();
-  if (IePeerManagement::PEER_CLOSE != m_fields.subtype)
+  NS_ASSERT(m_subtype < 3);
+  //m_subtype = (IePeerManagement::Subtype)i.ReadU8 ();
+  if ((uint8_t)(WifiMeshMultihopActionHeader::PEER_LINK_CONFIRM) == m_subtype)
+    m_aid = i.ReadNtohU16 ();
+  if ((uint8_t)(WifiMeshMultihopActionHeader::PEER_LINK_CLOSE) != m_subtype)
     {
-      i = m_fields.rates.Deserialize (i);
+      i = m_rates.Deserialize (i);
       i.Next(2);  //QoS
-      i = m_fields.meshId.Deserialize (i);
+      i = m_meshId.Deserialize (i);
     }
+  else
+    m_reasonCode = i.ReadNtohU16();
   return i.GetDistanceFrom (start);
 }
-  
+bool operator== (const PeerLinkFrameStart & a, const PeerLinkFrameStart & b)
+{
+  return (
+      (a.m_subtype == b.m_subtype) &&
+      (a.m_aid == b.m_aid) &&
+      (a.m_meshId.IsEqual(b.m_meshId))
+      );
+}
+#ifdef RUN_SELF_TESTS
+
+/// Built-in self test for PeerLinkFrameStart
+struct PeerLinkFrameStartBist : public Test 
+{
+  PeerLinkFrameStartBist () : Test ("Mesh/802.11s/IE/PeerLinkFrameStart") {}
+  virtual bool RunTests(); 
+};
+
+/// Test instance
+static PeerLinkFrameStartBist g_PeerLinkFrameStartBist;
+
+bool PeerLinkFrameStartBist::RunTests ()
+{
+  bool result (true);
+  {
+    PeerLinkFrameStart a;
+    PeerLinkFrameStart::PlinkFrameStartFields fields;
+    fields.subtype = (uint8_t)(WifiMeshMultihopActionHeader::PEER_LINK_OPEN);
+    fields.aid = 101;
+    fields.reasonCode = 12;
+    fields.meshId = Ssid("qwertyuiop");
+    a.SetPlinkFrameStart(fields);
+    Ptr<Packet> packet = Create<Packet> ();
+    packet->AddHeader (a);
+    PeerLinkFrameStart b;
+    b.SetPlinkFrameSubtype((uint8_t)(WifiMeshMultihopActionHeader::PEER_LINK_OPEN));
+    packet->RemoveHeader (b);
+    NS_TEST_ASSERT_EQUAL (a, b);
+  }
+  {
+    PeerLinkFrameStart a;
+    PeerLinkFrameStart::PlinkFrameStartFields fields;
+    fields.subtype = (uint8_t)(WifiMeshMultihopActionHeader::PEER_LINK_CONFIRM);
+    fields.aid = 1234;
+    fields.reasonCode = 12;
+    fields.meshId = Ssid("qwerty");
+    a.SetPlinkFrameStart(fields);
+    Ptr<Packet> packet = Create<Packet> ();
+    packet->AddHeader (a);
+    PeerLinkFrameStart b;
+    b.SetPlinkFrameSubtype((uint8_t)(WifiMeshMultihopActionHeader::PEER_LINK_CONFIRM));
+    packet->RemoveHeader (b);
+    NS_TEST_ASSERT_EQUAL (a, b);
+  }
+  {
+    PeerLinkFrameStart a;
+    PeerLinkFrameStart::PlinkFrameStartFields fields;
+    fields.subtype = (uint8_t)(WifiMeshMultihopActionHeader::PEER_LINK_CLOSE);
+    fields.aid = 10;
+    fields.meshId = Ssid("qqq");
+    fields.reasonCode = 12;
+    a.SetPlinkFrameStart(fields);
+    Ptr<Packet> packet = Create<Packet> ();
+    packet->AddHeader (a);
+    PeerLinkFrameStart b;
+    b.SetPlinkFrameSubtype((uint8_t)(WifiMeshMultihopActionHeader::PEER_LINK_CLOSE));
+    packet->RemoveHeader (b);
+    NS_TEST_ASSERT_EQUAL (a, b);
+  }
+  return result;  
+}
+#endif
 } // namespace dot11s
 } //namespace ns3