Restructured beacon timing element
authorKirill Andreev <andreev@iitp.ru>
Wed, 18 Mar 2009 12:44:36 +0300
changeset 4831 6a2923d9f526
parent 4830 fdddddbe55d5
child 4832 780477df53b8
Restructured beacon timing element
src/devices/mesh/802.11s/mesh-wifi-beacon-timing-element.cc
src/devices/mesh/802.11s/mesh-wifi-beacon-timing-element.h
src/devices/mesh/802.11s/wscript
src/devices/mesh/mesh-mgt-headers.cc
src/devices/mesh/mesh-wifi-peer-manager.cc
--- a/src/devices/mesh/802.11s/mesh-wifi-beacon-timing-element.cc	Wed Mar 18 11:51:31 2009 +0300
+++ b/src/devices/mesh/802.11s/mesh-wifi-beacon-timing-element.cc	Wed Mar 18 12:44:36 2009 +0300
@@ -76,7 +76,7 @@
   m_numOfUnits = 0;
 }
 
-NeighboursTimingUnitsList
+WifiBeaconTimingElement::NeighboursTimingUnitsList
 WifiBeaconTimingElement::GetNeighboursTimingElementsList()
 {
   return m_neighbours;
@@ -89,6 +89,8 @@
   Time  beacon_interval //MicroSeconds!
 )
 {
+  if(m_numOfUnits == 255)
+    return;
   //Firs we lookup if this element already exists
   for (NeighboursTimingUnitsList::iterator i = m_neighbours.begin(); i!= m_neighbours.end(); i++)
     if (
@@ -142,42 +144,38 @@
 
 }
 
-uint32_t
-WifiBeaconTimingElement::GetSerializedSize () const
-  {
-    return (2+5*m_numOfUnits > m_maxSize) ? 2+((m_maxSize-2)/5)*5 : 2+5*m_numOfUnits;
-  }
-Buffer::Iterator
-WifiBeaconTimingElement::Serialize (Buffer::Iterator i) const
+uint16_t
+WifiBeaconTimingElement::GetInformationSize () const
+{
+  return (2+5*m_numOfUnits > m_maxSize) ? 2+((m_maxSize-2)/5)*5 : 2+5*m_numOfUnits;
+}
+uint8_t
+WifiBeaconTimingElement::GetLengthField() const
+{
+  return m_numOfUnits;
+}
+
+void
+WifiBeaconTimingElement::PrintInformation(std::ostream& os) const
+{
+  //TODO
+}
+
+void
+WifiBeaconTimingElement::SerializeInformation (Buffer::Iterator i) const
+{
+  for (NeighboursTimingUnitsList::const_iterator j = m_neighbours.begin(); j!= m_neighbours.end(); j++)
   {
-    uint8_t can_be_written = (2+5*m_numOfUnits > m_maxSize) ? ((m_maxSize-2)/5) : m_numOfUnits;
-    int actually_written = 0;
-    i.WriteU8 (ElementId());
-    i.WriteU8 (can_be_written);
-    for (NeighboursTimingUnitsList::const_iterator j = m_neighbours.begin(); j!= m_neighbours.end(); j++)
-      {
-        i.WriteU8 ((*j)->GetAID());
-        i.WriteHtonU16 ((*j)->GetLastBeacon());
-        i.WriteHtonU16 ((*j)->GetBeaconInterval());
-        actually_written++;
-        if (actually_written > can_be_written)
-          break;
-      }
-    if (can_be_written < m_numOfUnits)
-      {
-        //move written units to the end of our list, so they
-        //can be sent in timing element with next beacon
-        //TODO:swap elements
-
-      }
-    return i;
+    i.WriteU8 ((*j)->GetAID());
+    i.WriteHtonU16 ((*j)->GetLastBeacon());
+    i.WriteHtonU16 ((*j)->GetBeaconInterval());
   }
-Buffer::Iterator
-WifiBeaconTimingElement::Deserialize (Buffer::Iterator i)
+}
+uint16_t 
+WifiBeaconTimingElement::DeserializeInformation (Buffer::Iterator start, uint8_t length)
 {
-  NS_ASSERT(ElementId() == i.ReadU8());
-  uint8_t num_to_read = i.ReadU8();
-  for (int j = 0; j < num_to_read; j ++)
+  Buffer::Iterator i = start;
+  for (int j = 0; j < length; j ++)
     {
       Ptr<WifiBeaconTimingElementUnit> new_element = Create<WifiBeaconTimingElementUnit>();
       new_element->SetAID(i.ReadU8());
@@ -185,7 +183,7 @@
       new_element->SetBeaconInterval(i.ReadNtohU16());
       m_neighbours.push_back(new_element);
     }
-  return i;
+  return i.GetDistanceFrom(start);
 };
 
 uint16_t
--- a/src/devices/mesh/802.11s/mesh-wifi-beacon-timing-element.h	Wed Mar 18 11:51:31 2009 +0300
+++ b/src/devices/mesh/802.11s/mesh-wifi-beacon-timing-element.h	Wed Mar 18 12:44:36 2009 +0300
@@ -27,6 +27,7 @@
 #include "ns3/buffer.h"
 #include "ns3/nstime.h"
 #include "ns3/dot11s-codes.h"
+#include "ns3/wifi-information-element.h"
 namespace ns3 {
 /**
  * \ingroup mesh
@@ -51,37 +52,32 @@
   //Beacon interval of remote mesh point:
   uint16_t BeaconInterval;
 };
-/**
- * \ingroup mesh
- * This type is a list of timing elements obtained from neigbours with their beacons:
- */
-typedef Ptr<WifiBeaconTimingElementUnit>  WifiBeaconTimingElementPointer;
 
 /**
  * \ingroup mesh
  */
-typedef std::list<WifiBeaconTimingElementPointer> NeighboursTimingUnitsList;
-
-/**
- * \ingroup mesh
- */
-class WifiBeaconTimingElement
+class WifiBeaconTimingElement : public WifiInformationElement
 {
 public:
+  /**
+   * \ingroup mesh
+   * This type is a list of timing elements obtained from neigbours with their beacons:
+   */
+  typedef std::list< Ptr<WifiBeaconTimingElementUnit> > NeighboursTimingUnitsList;
+
   WifiBeaconTimingElement();
   //This methods are needed for beacon collision
   //avoidance module:
-  NeighboursTimingUnitsList
-  GetNeighboursTimingElementsList();
+  NeighboursTimingUnitsList GetNeighboursTimingElementsList();
   //The arguments of the following methods are different
   //from internalBeaconTimingElementUnint. This was made
   //for better communication with peer manager.
   //BeaconTimingElement class should convert it into
   //proper types:
-  void   AddNeighboursTimingElementUnit(
+  void AddNeighboursTimingElementUnit(
     uint16_t aid,
-    Time  last_beacon, //MicroSeconds!
-    Time  beacon_interval //MicroSeconds!
+    Time last_beacon, //MicroSeconds!
+    Time beacon_interval //MicroSeconds!
   );
   void   DelNeighboursTimingElementUnit(
     uint16_t aid,
@@ -89,14 +85,17 @@
     Time  beacon_interval //MicroSeconds!
   );
   void   ClearTimingElement();
+protected:
+  WifiElementId ElementId() const {
+    return IE11S_BEACON_TIMING;
+  }
   //Serialize-deserialize methods:
-  uint32_t  GetSerializedSize () const;
-  Buffer::Iterator Serialize (Buffer::Iterator i) const;
-  Buffer::Iterator Deserialize (Buffer::Iterator i);
+  uint16_t  GetInformationSize () const;
+  uint8_t GetLengthField() const;
+  void SerializeInformation (Buffer::Iterator i) const;
+  uint16_t DeserializeInformation (Buffer::Iterator i, uint8_t length);
+  void PrintInformation(std::ostream& os) const; 
 private:
-  static uint8_t ElementId() {
-    return (uint8_t)IE11S_BEACON_TIMING;
-  }
   static uint16_t TimestampToU16(Time x);
   static uint16_t BeaconIntervalToU16(Time x);
   static uint8_t AidToU8(uint16_t x);
--- a/src/devices/mesh/802.11s/wscript	Wed Mar 18 11:51:31 2009 +0300
+++ b/src/devices/mesh/802.11s/wscript	Wed Mar 18 12:44:36 2009 +0300
@@ -4,26 +4,23 @@
     obj = bld.create_ns3_module('802.11s', ['wifi'])
     obj.source = [
         'wifi-information-element.cc',
+        'mesh-wifi-beacon-timing-element.cc',
         'mesh-configuration-element.cc',
         'mesh-wifi-preq-information-element.cc',
         'mesh-wifi-prep-information-element.cc',
         'mesh-wifi-perr-information-element.cc',
         'mesh-wifi-rann-information-element.cc',
-        # Not refactored
-        'mesh-wifi-beacon-timing-element.cc',
         ]
     headers = bld.new_task_gen('ns3header')
     headers.module = '802.11s'
     headers.source = [
-        # Refactored
         'wifi-information-element.h',
+        'mesh-wifi-beacon-timing-element.h',
         'mesh-configuration-element.h',
         'mesh-wifi-preq-information-element.h',
         'mesh-wifi-prep-information-element.h',
         'mesh-wifi-perr-information-element.h',
         'mesh-wifi-rann-information-element.h',
-        # Dirty
-        'mesh-wifi-beacon-timing-element.h',
         ]
 
 #    obj = bld.create_ns3_program('wifi-phy-test',
--- a/src/devices/mesh/mesh-mgt-headers.cc	Wed Mar 18 11:51:31 2009 +0300
+++ b/src/devices/mesh/mesh-mgt-headers.cc	Wed Mar 18 12:44:36 2009 +0300
@@ -78,7 +78,8 @@
     i.Next (MgtBeaconHeader::GetSerializedSize());
     m_meshConfig.Serialize(i);
     i.Next(m_meshConfig.GetSerializedSize());
-    i = m_meshTiming.Serialize(i);
+    m_meshTiming.Serialize(i);
+    i.Next(m_meshTiming.GetSerializedSize());
     i.Next (9); //MSCIE
   }
 
@@ -91,7 +92,7 @@
   i.Next (MgtBeaconHeader::GetSerializedSize());
   m_meshConfig.Deserialize(i);
   i.Next(m_meshConfig.GetSerializedSize());
-  i = m_meshTiming.Deserialize(i);
+  i.Next(m_meshTiming.Deserialize(i));
   i.Next (9); //MSCIE
   return i.GetDistanceFrom (start);
 }
--- a/src/devices/mesh/mesh-wifi-peer-manager.cc	Wed Mar 18 11:51:31 2009 +0300
+++ b/src/devices/mesh/mesh-wifi-peer-manager.cc	Wed Mar 18 12:44:36 2009 +0300
@@ -918,10 +918,10 @@
   NS_ASSERT(myBeacon!=m_myBeaconInfo.end());
   for (std::vector<Ptr<WifiPeerLinkDescriptor> >::iterator i = port->second.begin(); i!= port->second.end(); i++)
     {
-      NeighboursTimingUnitsList neighbours;
+      WifiBeaconTimingElement::NeighboursTimingUnitsList neighbours;
       neighbours = (*i)->GetBeaconTimingElement().GetNeighboursTimingElementsList();
       //first let's form the list of all kown TBTTs
-      for (NeighboursTimingUnitsList::const_iterator j = neighbours.begin(); j!= neighbours.end(); j++)
+      for (WifiBeaconTimingElement::NeighboursTimingUnitsList::const_iterator j = neighbours.begin(); j!= neighbours.end(); j++)
         {
           uint16_t beaconIntervalTimeUnits;
           beaconIntervalTimeUnits = (*j)->GetBeaconInterval();