src/devices/mesh/wifi-information-element-vector.cc
author Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
Thu Nov 12 13:01:01 2009 +0100 (2009-11-12)
changeset 5505 c0ac392289c3
parent 5499 778d4dcaaac7
permissions -rw-r--r--
replace RefCountBase with SimpleRefCount<> to avoid duplicate refcounting implementations.
andreev@5139
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
andreev@5139
     2
/*
andreev@5139
     3
 * Copyright (c) 2009 IITP RAS
andreev@5139
     4
 *
andreev@5139
     5
 * This program is free software; you can redistribute it and/or modify
andreev@5139
     6
 * it under the terms of the GNU General Public License version 2 as
andreev@5139
     7
 * published by the Free Software Foundation;
andreev@5139
     8
 *
andreev@5139
     9
 * This program is distributed in the hope that it will be useful,
andreev@5139
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
andreev@5139
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
andreev@5139
    12
 * GNU General Public License for more details.
andreev@5139
    13
 *
andreev@5139
    14
 * You should have received a copy of the GNU General Public License
andreev@5139
    15
 * along with this program; if not, write to the Free Software
andreev@5139
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
andreev@5139
    17
 *
andreev@5139
    18
 * Author: Pavel Boyko <boyko@iitp.ru>
andreev@5139
    19
 */
andreev@5139
    20
andreev@5140
    21
#include "wifi-information-element-vector.h"
andreev@5139
    22
#include "ns3/packet.h"
andreev@5140
    23
#include <algorithm>
andreev@5168
    24
#include "ns3/test.h"
andreev@5168
    25
#include "ns3/hwmp-protocol.h"
andreev@5139
    26
// All information elements:
andreev@5139
    27
#include "dot11s/ie-dot11s-beacon-timing.h"
andreev@5139
    28
#include "dot11s/ie-dot11s-configuration.h"
andreev@5139
    29
#include "dot11s/ie-dot11s-id.h"
andreev@5139
    30
#include "dot11s/ie-dot11s-metric-report.h"
andreev@5139
    31
#include "dot11s/ie-dot11s-peer-management.h"
andreev@5139
    32
#include "dot11s/ie-dot11s-peering-protocol.h"
andreev@5139
    33
#include "dot11s/ie-dot11s-perr.h"
andreev@5139
    34
#include "dot11s/ie-dot11s-prep.h"
andreev@5139
    35
#include "dot11s/ie-dot11s-preq.h"
andreev@5139
    36
#include "dot11s/ie-dot11s-rann.h"
andreev@5139
    37
andreev@5139
    38
namespace ns3 {
mathieu@5505
    39
mathieu@5505
    40
WifiInformationElement::~WifiInformationElement ()
mathieu@5505
    41
{}
mathieu@5505
    42
andreev@5161
    43
bool
andreev@5161
    44
operator< (WifiInformationElement const & a, WifiInformationElement const & b)
andreev@5161
    45
{
andreev@5161
    46
  return (a.ElementId () < b.ElementId ());
andreev@5161
    47
}
andreev@5161
    48
andreev@5139
    49
WifiInformationElementVector::WifiInformationElementVector () :
andreev@5139
    50
  m_maxSize (1500)
andreev@5139
    51
{
andreev@5139
    52
}
andreev@5139
    53
WifiInformationElementVector::~WifiInformationElementVector ()
andreev@5139
    54
{
craigdo@5417
    55
  for (IE_VECTOR::iterator i = m_elements.begin (); i != m_elements.end (); i++)
craigdo@5417
    56
    {
craigdo@5417
    57
      *i = 0;
craigdo@5417
    58
    }
craigdo@5417
    59
  m_elements.clear ();
andreev@5139
    60
}
andreev@5158
    61
TypeId
andreev@5158
    62
WifiInformationElementVector::GetTypeId ()
andreev@5158
    63
{
andreev@5158
    64
  static TypeId tid = TypeId ("ns3::WifiInformationElementVector")
mazo@5499
    65
                      .SetParent<Header> ()
mazo@5499
    66
                      .AddConstructor<WifiInformationElementVector> ();
andreev@5158
    67
  return tid;
andreev@5158
    68
}
andreev@5158
    69
TypeId
andreev@5158
    70
WifiInformationElementVector::GetInstanceTypeId () const
andreev@5158
    71
{
andreev@5158
    72
  return GetTypeId ();
andreev@5158
    73
}
andreev@5158
    74
uint32_t
andreev@5158
    75
WifiInformationElementVector::GetSerializedSize () const
andreev@5158
    76
{
andreev@5158
    77
  return GetSize ();
andreev@5158
    78
}
andreev@5158
    79
void
andreev@5158
    80
WifiInformationElementVector::Serialize (Buffer::Iterator start) const
andreev@5158
    81
{
mazo@5423
    82
  for(IE_VECTOR::const_iterator i = m_elements.begin (); i != m_elements.end (); i ++)
andreev@5158
    83
    {
andreev@5158
    84
      start.WriteU8((*i)->ElementId ());
andreev@5158
    85
      start.WriteU8 ((*i)->GetInformationSize ());
andreev@5158
    86
      (*i)->SerializeInformation (start);
andreev@5158
    87
      start.Next ((*i)->GetInformationSize ());
andreev@5158
    88
    }
andreev@5158
    89
}
andreev@5158
    90
uint32_t
andreev@5158
    91
WifiInformationElementVector::Deserialize (Buffer::Iterator start)
andreev@5158
    92
{
andreev@5158
    93
  Buffer::Iterator i = start;
andreev@5158
    94
  uint32_t size = start.GetSize();
andreev@5158
    95
  while (size > 0)
andreev@5158
    96
    {
andreev@5158
    97
      uint32_t deserialized = DeserializeSingleIe(i);
andreev@5158
    98
      i.Next (deserialized);
andreev@5158
    99
      size -= deserialized;
andreev@5158
   100
    }
andreev@5158
   101
  return i.GetDistanceFrom(start);
andreev@5158
   102
}
andreev@5158
   103
uint32_t
andreev@5158
   104
WifiInformationElementVector::DeserializeSingleIe(Buffer::Iterator start)
andreev@5158
   105
{
andreev@5158
   106
  Buffer::Iterator i = start;
andreev@5158
   107
  uint8_t id = i.ReadU8 ();
andreev@5158
   108
  uint8_t length = i.ReadU8 ();
andreev@5158
   109
  Ptr<WifiInformationElement> newElement;
andreev@5158
   110
  switch (id)
andreev@5158
   111
    {
andreev@5158
   112
  case IE11S_MESH_CONFIGURATION:
andreev@5158
   113
    newElement = Create<dot11s::IeConfiguration> ();
andreev@5158
   114
    break;
andreev@5158
   115
  case IE11S_MESH_ID:
andreev@5158
   116
    newElement = Create<dot11s::IeMeshId> ();
andreev@5158
   117
    break;
andreev@5158
   118
  case IE11S_LINK_METRIC_REPORT:
andreev@5158
   119
    newElement = Create<dot11s::IeLinkMetricReport> ();
andreev@5158
   120
    break;
andreev@5158
   121
  case IE11S_PEERING_MANAGEMENT:
andreev@5158
   122
    newElement = Create<dot11s::IePeerManagement> ();
andreev@5158
   123
    break;
andreev@5158
   124
  case IE11S_BEACON_TIMING:
andreev@5158
   125
    newElement = Create<dot11s::IeBeaconTiming> ();
andreev@5158
   126
    break;
andreev@5158
   127
  case IE11S_RANN:
andreev@5158
   128
    newElement = Create<dot11s::IeRann> ();
andreev@5158
   129
    break;
andreev@5158
   130
  case IE11S_PREQ:
andreev@5158
   131
    newElement = Create<dot11s::IePreq> ();
andreev@5158
   132
    break;
andreev@5158
   133
  case IE11S_PREP:
andreev@5158
   134
    newElement = Create<dot11s::IePrep> ();
andreev@5158
   135
    break;
andreev@5158
   136
  case IE11S_PERR:
andreev@5158
   137
    newElement = Create<dot11s::IePerr> ();
andreev@5158
   138
    break;
andreev@5158
   139
  case IE11S_MESH_PEERING_PROTOCOL_VERSION:
andreev@5158
   140
    newElement = Create<dot11s::IePeeringProtocol> ();
andreev@5158
   141
    break;
andreev@5158
   142
  default:
andreev@5158
   143
    NS_FATAL_ERROR ("Information element " << (uint16_t) id << " is not implemented");
andreev@5158
   144
    return 0;
andreev@5158
   145
    }
andreev@5158
   146
  if (GetSize () + length > m_maxSize)
andreev@5158
   147
    {
andreev@5158
   148
      NS_FATAL_ERROR ("Check max size for information element!");
andreev@5158
   149
    }
andreev@5158
   150
  newElement->DeserializeInformation (i, length);
andreev@5158
   151
  i.Next (length);
andreev@5158
   152
  m_elements.push_back (newElement);
andreev@5158
   153
  return i.GetDistanceFrom(start);
andreev@5158
   154
}
andreev@5158
   155
void
andreev@5158
   156
WifiInformationElementVector::Print(std::ostream & os) const
andreev@5158
   157
{
andreev@5158
   158
  //TODO
andreev@5158
   159
}
andreev@5139
   160
void
andreev@5139
   161
WifiInformationElementVector::SetMaxSize (uint16_t size)
andreev@5139
   162
{
andreev@5139
   163
  m_maxSize = size;
andreev@5139
   164
}
andreev@5139
   165
WifiInformationElementVector::Iterator
andreev@5139
   166
WifiInformationElementVector::Begin ()
andreev@5139
   167
{
andreev@5139
   168
  return m_elements.begin ();
andreev@5139
   169
}
andreev@5139
   170
WifiInformationElementVector::Iterator
andreev@5139
   171
WifiInformationElementVector::End ()
andreev@5139
   172
{
andreev@5139
   173
  return m_elements.end ();
andreev@5139
   174
}
andreev@5139
   175
bool
andreev@5139
   176
WifiInformationElementVector::AddInformationElement (Ptr<WifiInformationElement> element)
andreev@5139
   177
{
andreev@5159
   178
  if (element->GetInformationSize () + 2 + GetSize () > m_maxSize)
andreev@5139
   179
    {
andreev@5139
   180
      return false;
andreev@5139
   181
    }
andreev@5139
   182
  m_elements.push_back (element);
andreev@5139
   183
  return true;
andreev@5139
   184
}
andreev@5139
   185
Ptr<WifiInformationElement>
andreev@5139
   186
WifiInformationElementVector::FindFirst (enum WifiElementId id) const
andreev@5139
   187
{
andreev@5139
   188
  for (IE_VECTOR::const_iterator i = m_elements.begin (); i != m_elements.end (); i++)
andreev@5139
   189
    {
andreev@5139
   190
      if ((*i)->ElementId () == id)
andreev@5139
   191
        {
andreev@5139
   192
          return (*i);
andreev@5139
   193
        }
andreev@5139
   194
    }
andreev@5139
   195
  return 0;
andreev@5139
   196
}
andreev@5140
   197
namespace {
andreev@5140
   198
struct PIEComparator
andreev@5140
   199
{
andreev@5140
   200
  bool
andreev@5140
   201
  operator () (Ptr<WifiInformationElement> a, Ptr<WifiInformationElement> b) const
andreev@5140
   202
  {
andreev@5140
   203
    return ((*PeekPointer (a)) < (*PeekPointer (b)));
andreev@5140
   204
  }
andreev@5140
   205
};
andreev@5140
   206
}
andreev@5139
   207
uint32_t
andreev@5139
   208
WifiInformationElementVector::GetSize () const
andreev@5139
   209
{
andreev@5139
   210
  uint32_t size = 0;
andreev@5139
   211
  for (IE_VECTOR::const_iterator i = m_elements.begin (); i != m_elements.end (); i++)
andreev@5139
   212
    {
andreev@5159
   213
      size += ((*i)->GetInformationSize () + 2);
andreev@5139
   214
    }
andreev@5139
   215
  return size;
andreev@5139
   216
}
boyko@5184
   217
andreev@5140
   218
bool
andreev@5140
   219
operator== (const WifiInformationElementVector & a, const WifiInformationElementVector & b)
andreev@5140
   220
{
andreev@5140
   221
  if (a.m_elements.size () != b.m_elements.size ())
andreev@5140
   222
    {
andreev@5140
   223
      NS_ASSERT(false);
andreev@5140
   224
      return false;
andreev@5140
   225
    }
andreev@5140
   226
  WifiInformationElementVector::IE_VECTOR::const_iterator j = b.m_elements.begin ();
andreev@5140
   227
  for (WifiInformationElementVector::IE_VECTOR::const_iterator i = a.m_elements.begin (); i
andreev@5140
   228
      != a.m_elements.end (); i++, j++)
andreev@5160
   229
    {
andreev@5140
   230
      if ((*i)->ElementId () != (*j)->ElementId ())
andreev@5140
   231
        {
andreev@5140
   232
          return false;
andreev@5140
   233
        }
andreev@5159
   234
      if ((*i)->GetInformationSize () != (*j)->GetInformationSize ())
andreev@5140
   235
        {
andreev@5140
   236
          return false;
andreev@5140
   237
        }
andreev@5160
   238
      uint8_t id = (*i)->ElementId ();
andreev@5160
   239
      switch (id)
andreev@5160
   240
        {
andreev@5160
   241
      case IE11S_MESH_CONFIGURATION:
andreev@5160
   242
        if (DynamicCast<dot11s::IeConfiguration> ((*i)) == 0)
andreev@5160
   243
          {
andreev@5160
   244
            return false;
andreev@5160
   245
          }
andreev@5160
   246
        if (DynamicCast<dot11s::IeConfiguration> ((*j)) == 0)
andreev@5160
   247
          {
andreev@5160
   248
            return false;
andreev@5160
   249
          }
andreev@5160
   250
        if (!(*DynamicCast<dot11s::IeConfiguration> ((*i)) == *DynamicCast<dot11s::IeConfiguration> ((*j))))
andreev@5160
   251
          {
andreev@5160
   252
            return false;
andreev@5160
   253
          }
andreev@5160
   254
        break;
andreev@5160
   255
      case IE11S_MESH_ID:
andreev@5160
   256
        if (DynamicCast<dot11s::IeMeshId> ((*i)) == 0)
andreev@5160
   257
          {
andreev@5160
   258
            return false;
andreev@5160
   259
          }
andreev@5160
   260
        if (DynamicCast<dot11s::IeMeshId> ((*j)) == 0)
andreev@5160
   261
          {
andreev@5160
   262
            return false;
andreev@5160
   263
          }
andreev@5160
   264
        if (!(*DynamicCast<dot11s::IeMeshId> ((*i)) == *DynamicCast<dot11s::IeMeshId> ((*j))))
andreev@5160
   265
          {
andreev@5160
   266
            return false;
andreev@5160
   267
          }
andreev@5160
   268
        break;
andreev@5160
   269
      case IE11S_LINK_METRIC_REPORT:
andreev@5160
   270
        if (DynamicCast<dot11s::IeLinkMetricReport> ((*i)) == 0)
andreev@5160
   271
          {
andreev@5160
   272
            return false;
andreev@5160
   273
          }
andreev@5160
   274
        if (DynamicCast<dot11s::IeLinkMetricReport> ((*j)) == 0)
andreev@5160
   275
          {
andreev@5160
   276
            return false;
andreev@5160
   277
          }
andreev@5160
   278
        if (!(*DynamicCast<dot11s::IeLinkMetricReport> ((*i)) == *DynamicCast<dot11s::IeLinkMetricReport> (
andreev@5160
   279
            (*j))))
andreev@5160
   280
          {
andreev@5160
   281
            return false;
andreev@5160
   282
          }
andreev@5160
   283
        break;
andreev@5160
   284
      case IE11S_PEERING_MANAGEMENT:
andreev@5160
   285
        if (DynamicCast<dot11s::IePeerManagement> ((*i)) == 0)
andreev@5160
   286
          {
andreev@5160
   287
            return false;
andreev@5160
   288
          }
andreev@5160
   289
        if (DynamicCast<dot11s::IePeerManagement> ((*j)) == 0)
andreev@5160
   290
          {
andreev@5160
   291
            return false;
andreev@5160
   292
          }
andreev@5160
   293
        if (!(*DynamicCast<dot11s::IePeerManagement> ((*i)) == *DynamicCast<dot11s::IePeerManagement> ((*j))))
andreev@5160
   294
          {
andreev@5160
   295
            return false;
andreev@5160
   296
          }
andreev@5160
   297
        break;
andreev@5160
   298
      case IE11S_BEACON_TIMING:
andreev@5160
   299
        if (DynamicCast<dot11s::IeBeaconTiming> ((*i)) == 0)
andreev@5160
   300
          {
andreev@5160
   301
            return false;
andreev@5160
   302
          }
andreev@5160
   303
        if (DynamicCast<dot11s::IeBeaconTiming> ((*j)) == 0)
andreev@5160
   304
          {
andreev@5160
   305
            return false;
andreev@5160
   306
          }
andreev@5160
   307
        if (!(*DynamicCast<dot11s::IeBeaconTiming> ((*i)) == *DynamicCast<dot11s::IeBeaconTiming> ((*j))))
andreev@5160
   308
          {
andreev@5160
   309
            return false;
andreev@5160
   310
          }
andreev@5160
   311
        break;
andreev@5160
   312
      case IE11S_RANN:
andreev@5160
   313
        if (DynamicCast<dot11s::IeRann> ((*i)) == 0)
andreev@5160
   314
          {
andreev@5160
   315
            return false;
andreev@5160
   316
          }
andreev@5160
   317
        if (DynamicCast<dot11s::IeRann> ((*j)) == 0)
andreev@5160
   318
          {
andreev@5160
   319
            return false;
andreev@5160
   320
          }
andreev@5160
   321
        if (!(*DynamicCast<dot11s::IeRann> ((*i)) == *DynamicCast<dot11s::IeRann> ((*j))))
andreev@5160
   322
          {
andreev@5160
   323
            return false;
andreev@5160
   324
          }
andreev@5160
   325
        break;
andreev@5160
   326
      case IE11S_PREQ:
andreev@5160
   327
        if (DynamicCast<dot11s::IePreq> ((*i)) == 0)
andreev@5160
   328
          {
andreev@5160
   329
            return false;
andreev@5160
   330
          }
andreev@5160
   331
        if (DynamicCast<dot11s::IePreq> ((*j)) == 0)
andreev@5160
   332
          {
andreev@5160
   333
            return false;
andreev@5160
   334
          }
andreev@5160
   335
        if (!(*DynamicCast<dot11s::IePreq> ((*i)) == *DynamicCast<dot11s::IePreq> ((*j))))
andreev@5160
   336
          {
andreev@5160
   337
            return false;
andreev@5160
   338
          }
andreev@5160
   339
        break;
andreev@5160
   340
      case IE11S_PREP:
andreev@5160
   341
        if (DynamicCast<dot11s::IePrep> ((*i)) == 0)
andreev@5160
   342
          {
andreev@5160
   343
            return false;
andreev@5160
   344
          }
andreev@5160
   345
        if (DynamicCast<dot11s::IePrep> ((*j)) == 0)
andreev@5160
   346
          {
andreev@5160
   347
            return false;
andreev@5160
   348
          }
andreev@5160
   349
        if (!(*DynamicCast<dot11s::IePrep> ((*i)) == *DynamicCast<dot11s::IePrep> ((*j))))
andreev@5160
   350
          {
andreev@5160
   351
            return false;
andreev@5160
   352
          }
andreev@5160
   353
andreev@5160
   354
        break;
andreev@5160
   355
      case IE11S_PERR:
andreev@5160
   356
        if (DynamicCast<dot11s::IePerr> ((*i)) == 0)
andreev@5160
   357
          {
andreev@5160
   358
            return false;
andreev@5160
   359
          }
andreev@5160
   360
        if (DynamicCast<dot11s::IePerr> ((*j)) == 0)
andreev@5160
   361
          {
andreev@5160
   362
            return false;
andreev@5160
   363
          }
andreev@5160
   364
        if (!(*DynamicCast<dot11s::IePerr> ((*i)) == *DynamicCast<dot11s::IePerr> ((*j))))
andreev@5160
   365
          {
andreev@5160
   366
            return false;
andreev@5160
   367
          }
andreev@5160
   368
        break;
andreev@5160
   369
      case IE11S_MESH_PEERING_PROTOCOL_VERSION:
andreev@5160
   370
        break;
andreev@5160
   371
      default:
andreev@5160
   372
        NS_FATAL_ERROR ("Information element " << (uint16_t) id << " is not implemented");
andreev@5160
   373
        return false;
andreev@5160
   374
        }
andreev@5140
   375
    }
andreev@5140
   376
  return true;
andreev@5139
   377
}
andreev@5140
   378
boyko@5314
   379
//-----------------------------------------------------------------------------
boyko@5314
   380
// Unit tests
boyko@5314
   381
//-----------------------------------------------------------------------------
boyko@5314
   382
/// Built-in self test for WifiInformationElementVector and all IE
boyko@5314
   383
struct WifiInformationElementVectorBist : public TestCase
andreev@5140
   384
{
andreev@5140
   385
  WifiInformationElementVectorBist () :
boyko@5314
   386
    TestCase ("Serializarion test for all mesh information elements")
andreev@5140
   387
  {
andreev@5140
   388
  };
boyko@5314
   389
  bool DoRun ();
andreev@5140
   390
};
andreev@5140
   391
andreev@5140
   392
bool
boyko@5314
   393
WifiInformationElementVectorBist::DoRun ()
andreev@5140
   394
{
andreev@5140
   395
  WifiInformationElementVector vector;
andreev@5160
   396
  {
andreev@5160
   397
    //Mesh ID test
andreev@5160
   398
    Ptr<dot11s::IeMeshId> meshId = Create<dot11s::IeMeshId> ("qwerty");
andreev@5160
   399
    vector.AddInformationElement (meshId);
andreev@5160
   400
  }
andreev@5160
   401
  {
andreev@5160
   402
    Ptr<dot11s::IeConfiguration> config = Create<dot11s::IeConfiguration> ();
andreev@5160
   403
    vector.AddInformationElement (config);
andreev@5160
   404
  }
andreev@5160
   405
  {
andreev@5160
   406
    Ptr<dot11s::IeLinkMetricReport> report = Create<dot11s::IeLinkMetricReport> (123456);
andreev@5160
   407
    vector.AddInformationElement (report);
andreev@5160
   408
  }
andreev@5160
   409
  {
andreev@5160
   410
    Ptr<dot11s::IePeerManagement> peerMan1 = Create<dot11s::IePeerManagement> ();
andreev@5160
   411
    peerMan1->SetPeerOpen (1);
andreev@5160
   412
    Ptr<dot11s::IePeerManagement> peerMan2 = Create<dot11s::IePeerManagement> ();
andreev@5160
   413
    peerMan2->SetPeerConfirm (1, 2);
andreev@5160
   414
    Ptr<dot11s::IePeerManagement> peerMan3 = Create<dot11s::IePeerManagement> ();
andreev@5160
   415
    peerMan3->SetPeerClose (1, 2, dot11s::REASON11S_MESH_CAPABILITY_POLICY_VIOLATION);
andreev@5160
   416
    vector.AddInformationElement (peerMan1);
andreev@5160
   417
    vector.AddInformationElement (peerMan2);
andreev@5160
   418
    vector.AddInformationElement (peerMan3);
andreev@5160
   419
  }
andreev@5160
   420
  {
andreev@5160
   421
    Ptr<dot11s::IeBeaconTiming>  beaconTiming = Create<dot11s::IeBeaconTiming> ();
andreev@5160
   422
    beaconTiming->AddNeighboursTimingElementUnit (1, Seconds (1.0), Seconds (4.0));
andreev@5160
   423
    beaconTiming->AddNeighboursTimingElementUnit (2, Seconds (2.0), Seconds (3.0));
andreev@5160
   424
    beaconTiming->AddNeighboursTimingElementUnit (3, Seconds (3.0), Seconds (2.0));
andreev@5160
   425
    beaconTiming->AddNeighboursTimingElementUnit (4, Seconds (4.0), Seconds (1.0));
andreev@5160
   426
    vector.AddInformationElement (beaconTiming);
andreev@5160
   427
  }
andreev@5160
   428
  {
andreev@5160
   429
    Ptr<dot11s::IeRann> rann = Create<dot11s::IeRann> ();
andreev@5160
   430
    rann->SetFlags (1);
andreev@5160
   431
    rann->SetHopcount (2);
andreev@5160
   432
    rann->SetTTL (4);
andreev@5160
   433
    rann->DecrementTtl ();
boyko@5314
   434
    NS_TEST_ASSERT_MSG_EQ (rann->GetTtl (), 3, "SetTtl works");
andreev@5160
   435
    rann->SetOriginatorAddress (Mac48Address ("11:22:33:44:55:66"));
andreev@5160
   436
    rann->SetDestSeqNumber (5);
andreev@5160
   437
    rann->SetMetric (6);
andreev@5160
   438
    rann->IncrementMetric (2);
boyko@5314
   439
    NS_TEST_ASSERT_MSG_EQ (rann->GetMetric (), 8, "SetMetric works");
andreev@5160
   440
    vector.AddInformationElement (rann);
andreev@5160
   441
  }
andreev@5160
   442
  {
andreev@5160
   443
    Ptr<dot11s::IePreq> preq = Create<dot11s::IePreq> ();
andreev@5160
   444
    preq->SetHopcount (0);
andreev@5160
   445
    preq->SetTTL (1);
andreev@5160
   446
    preq->SetPreqID (2);
andreev@5160
   447
    preq->SetOriginatorAddress (Mac48Address ("11:22:33:44:55:66"));
andreev@5160
   448
    preq->SetOriginatorSeqNumber (3);
andreev@5160
   449
    preq->SetLifetime (4);
andreev@5160
   450
    preq->AddDestinationAddressElement (false, false, Mac48Address ("11:11:11:11:11:11"), 5);
andreev@5160
   451
    preq->AddDestinationAddressElement (false, false, Mac48Address ("22:22:22:22:22:22"), 6);
andreev@5160
   452
    vector.AddInformationElement (preq);
andreev@5160
   453
  }
andreev@5160
   454
  {
andreev@5160
   455
    Ptr<dot11s::IePrep> prep = Create<dot11s::IePrep> ();
andreev@5160
   456
    prep->SetFlags (12);
andreev@5160
   457
    prep->SetHopcount (11);
andreev@5160
   458
    prep->SetTtl (10);
andreev@5160
   459
    prep->SetDestinationAddress (Mac48Address ("11:22:33:44:55:66"));
andreev@5160
   460
    prep->SetDestinationSeqNumber (123);
andreev@5160
   461
    prep->SetLifetime (5000);
andreev@5160
   462
    prep->SetMetric (4321);
andreev@5160
   463
    prep->SetOriginatorAddress (Mac48Address ("33:00:22:00:11:00"));
andreev@5160
   464
    prep->SetOriginatorSeqNumber (666);
andreev@5160
   465
    vector.AddInformationElement (prep);
andreev@5160
   466
  }
andreev@5160
   467
  {
andreev@5160
   468
    Ptr<dot11s::IePerr> perr = Create<dot11s::IePerr> ();
andreev@5168
   469
    dot11s::HwmpProtocol::FailedDestination dest;
andreev@5160
   470
    dest.destination = Mac48Address ("11:22:33:44:55:66");
andreev@5160
   471
    dest.seqnum = 1;
andreev@5160
   472
    perr->AddAddressUnit (dest);
andreev@5160
   473
    dest.destination = Mac48Address ("10:20:30:40:50:60");
andreev@5160
   474
    dest.seqnum = 2;
andreev@5160
   475
    perr->AddAddressUnit (dest);
andreev@5160
   476
    dest.destination = Mac48Address ("01:02:03:04:05:06");
andreev@5160
   477
    dest.seqnum = 3;
andreev@5160
   478
    perr->AddAddressUnit (dest);
andreev@5160
   479
    vector.AddInformationElement (perr);
andreev@5160
   480
  }
andreev@5159
   481
  Ptr<Packet> packet = Create<Packet> ();
andreev@5159
   482
  packet->AddHeader (vector);
andreev@5159
   483
  WifiInformationElementVector resultVector;
andreev@5159
   484
  packet->RemoveHeader (resultVector);
boyko@5314
   485
  NS_TEST_ASSERT_MSG_EQ (vector, resultVector, "Roundtrip serialization of all known information elements works");
andreev@5140
   486
  
boyko@5314
   487
  return false;
andreev@5140
   488
}
andreev@5140
   489
boyko@5314
   490
class MeshTestSuite : public TestSuite
boyko@5314
   491
{
boyko@5314
   492
public:
boyko@5314
   493
  MeshTestSuite ();
boyko@5314
   494
};
boyko@5314
   495
boyko@5314
   496
MeshTestSuite::MeshTestSuite ()
boyko@5314
   497
  : TestSuite ("devices-mesh", UNIT)
boyko@5314
   498
{
boyko@5314
   499
  AddTestCase (new WifiInformationElementVectorBist);
boyko@5314
   500
}
boyko@5314
   501
boyko@5314
   502
MeshTestSuite g_meshTestSuite;
boyko@5314
   503
andreev@5140
   504
} //namespace ns3