A Discrete-Event Network Simulator
API
wifi-information-element-vector.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2009 IITP RAS
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Pavel Boyko <boyko@iitp.ru>
19  */
20 
22 
23 namespace ns3 {
24 
25 NS_OBJECT_ENSURE_REGISTERED (WifiInformationElementVector);
26 
28  : m_maxSize (1500)
29 {
30 }
31 
33 {
34  for (IE_VECTOR::iterator i = m_elements.begin (); i != m_elements.end (); i++)
35  {
36  *i = 0;
37  }
38  m_elements.clear ();
39 }
40 
41 TypeId
43 {
44  static TypeId tid = TypeId ("ns3::WifiInformationElementVector")
45  .SetParent<Header> ()
46  .SetGroupName ("Wifi")
47  .AddConstructor<WifiInformationElementVector> ();
48  return tid;
49 }
50 
51 TypeId
53 {
54  return GetTypeId ();
55 }
56 
57 uint32_t
59 {
60  return GetSize ();
61 }
62 
63 void
65 {
66  for (IE_VECTOR::const_iterator i = m_elements.begin (); i != m_elements.end (); i++)
67  {
68  start = (*i)->Serialize (start);
69  }
70 }
71 
72 uint32_t
74 {
75  NS_FATAL_ERROR ("This variant should not be called on a variable-sized header");
76  return 0;
77 }
78 
79 uint32_t
81 {
82  uint32_t size = start.GetDistanceFrom (end);
83  uint32_t remaining = size;
84  while (remaining > 0)
85  {
86  uint32_t deserialized = DeserializeSingleIe (start);
87  start.Next (deserialized);
88  NS_ASSERT (deserialized <= remaining);
89  remaining -= deserialized;
90  }
91  NS_ASSERT_MSG (remaining == 0, "Error in deserialization");
92  return size;
93 }
94 
95 uint32_t
97 {
99  uint8_t id = i.ReadU8 ();
100  //unused: uint8_t length = i.ReadU8 ();
101  //but need side effects of read:
102  i.ReadU8 ();
103  Ptr<WifiInformationElement> newElement;
104  switch (id)
105  {
106  case 0: // eliminate compiler warning
107  default:
108  NS_FATAL_ERROR ("Information element " << +id << " is not implemented");
109  return 0;
110  }
111  /* unreachable: b/c switch is guaranteed to return from this function
112  if (GetSize () + length > m_maxSize)
113  {
114  NS_FATAL_ERROR ("Check max size for information element!");
115  }
116  newElement->DeserializeInformationField (i, length);
117  i.Next (length);
118  m_elements.push_back (newElement);
119  return i.GetDistanceFrom (start);
120  */
121 }
122 
123 void
124 WifiInformationElementVector::Print (std::ostream & os) const
125 {
126  for (IE_VECTOR::const_iterator i = m_elements.begin (); i != m_elements.end (); i++)
127  {
128  os << "(";
129  (*i)->Print (os);
130  os << ")";
131  }
132 }
133 
136 {
137  return m_elements.begin ();
138 }
139 
142 {
143  return m_elements.end ();
144 }
145 
146 bool
148 {
149  if (element->GetInformationFieldSize () + 2 + GetSize () > m_maxSize)
150  {
151  return false;
152  }
153  m_elements.push_back (element);
154  return true;
155 }
156 
159 {
160  for (IE_VECTOR::const_iterator i = m_elements.begin (); i != m_elements.end (); i++)
161  {
162  if ((*i)->ElementId () == id)
163  {
164  return (*i);
165  }
166  }
167  return 0;
168 }
169 
170 uint32_t
172 {
173  uint32_t size = 0;
174  for (IE_VECTOR::const_iterator i = m_elements.begin (); i != m_elements.end (); i++)
175  {
176  size += ((*i)->GetInformationFieldSize () + 2);
177  }
178  return size;
179 }
180 
181 bool
183 {
184  if (m_elements.size () != a.m_elements.size ())
185  {
186  NS_ASSERT (false);
187  return false;
188  }
189  //In principle we could bypass some of the faffing about (and speed
190  //the comparison) by simply serialising each IE vector into a
191  //buffer and memcmp'ing the two.
192  //
193  //I'm leaving it like this, however, so that there is the option of
194  //having individual Information Elements implement slightly more
195  //flexible equality operators.
196  WifiInformationElementVector::IE_VECTOR::const_iterator j = a.m_elements.begin ();
197  for (WifiInformationElementVector::IE_VECTOR::const_iterator i = m_elements.begin (); i
198  != m_elements.end (); i++, j++)
199  {
200  if (!(*(*i) == *(*j)))
201  {
202  return false;
203  }
204  }
205 
206  return true;
207 }
208 
209 } //namespace ns3
Protocol header serialization and deserialization.
Definition: header.h:42
static TypeId GetTypeId()
Get the type ID.
IE_VECTOR m_elements
Information element vector.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
virtual uint8_t GetInformationFieldSize() const =0
Length of serialized information (i.e., the length of the body of the IE, not including the Element I...
NS_ASSERT_MSG(false, "Ipv4AddressGenerator::MaskToIndex(): Impossible")
def start()
Definition: core.py:1844
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
Definition: assert.h:67
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:162
virtual bool operator==(const WifiInformationElementVector &a) const
Check if the given WifiInformationElementVectors are equivalent.
bool AddInformationElement(Ptr< WifiInformationElement > element)
add an IE, if maxSize has exceeded, returns false
virtual void Serialize(Buffer::Iterator start) const
iterator in a Buffer instance
Definition: buffer.h:98
Iterator End()
Returns End of the vector.
std::vector< Ptr< WifiInformationElement > >::iterator Iterator
As soon as this is a vector, we define an Iterator.
TypeId GetInstanceTypeId() const
Get the most derived TypeId for this Object.
virtual uint32_t DeserializeSingleIe(Buffer::Iterator start)
Needed when you try to deserialize a lonely IE inside other header.
uint16_t m_maxSize
Size in bytes (actually, max packet length)
Iterator Begin()
Returns Begin of the vector.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
virtual void Print(std::ostream &os) const
virtual uint32_t Deserialize(Buffer::Iterator start)
Information element vectorImplements a vector of WifiInformationElements.
uint32_t GetSize() const
Current number of bytes.
uint8_t ReadU8(void)
Definition: buffer.h:1021
uint8_t WifiInformationElementId
This type is used to represent an Information Element ID.
a unique identifier for an interface.
Definition: type-id.h:58
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:915
Ptr< WifiInformationElement > FindFirst(WifiInformationElementId id) const
vector of pointers to information elements is the body of IeVector