--- 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();