src/devices/mesh/flame/flame-protocol.cc
author Kirill Andreev <andreev@iitp.ru>
Mon, 03 Aug 2009 19:13:46 +0400
changeset 5145 7f50ab7ce59d
parent 5132 aee541a30256
child 5147 546c5d9a7e64
permissions -rw-r--r--
Added path update to FLAME
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5079
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
     1
/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
     2
/*
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
     3
 * Copyright (c) 2009 IITP RAS
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
     4
 *
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
     8
 *
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
    12
 * GNU General Public License for more details.
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
    13
 *
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
    17
 *
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
    18
 * Author: Kirill Andreev <andreev@iitp.ru>
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
    19
 */
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
    20
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
    21
#include "flame-protocol.h"
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    22
#include "flame-header.h"
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
    23
#include "ns3/llc-snap-header.h"
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    24
#include "ns3/log.h"
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    25
#include "ns3/simulator.h"
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    26
#include "ns3/packet.h"
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    27
#include "ns3/mesh-point-device.h"
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    28
#include "ns3/wifi-net-device.h"
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    29
#include "ns3/mesh-point-device.h"
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    30
#include "ns3/mesh-wifi-interface-mac.h"
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    31
#include "ns3/random-variable.h"
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    32
5095
9ee59991bbef Flame review
Pavel Boyko <boyko@iitp.ru>
parents: 5094
diff changeset
    33
NS_LOG_COMPONENT_DEFINE ("FlameProtocol");
9ee59991bbef Flame review
Pavel Boyko <boyko@iitp.ru>
parents: 5094
diff changeset
    34
5132
aee541a30256 Restored newline at namespace
Kirill Andreev <andreev@iitp.ru>
parents: 5129
diff changeset
    35
namespace ns3 {
aee541a30256 Restored newline at namespace
Kirill Andreev <andreev@iitp.ru>
parents: 5129
diff changeset
    36
namespace flame {
5080
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    37
//-----------------------------------------------------------------------------
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    38
// FlameTag
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    39
//-----------------------------------------------------------------------------
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    40
NS_OBJECT_ENSURE_REGISTERED (FlameTag);
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    41
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    42
TypeId
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    43
FlameTag::GetTypeId ()
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    44
{
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
    45
  static TypeId tid = TypeId ("ns3::flame::FlameTag") .SetParent<Tag> () .AddConstructor<FlameTag> ();
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
    46
  return tid;
5080
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    47
}
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    48
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    49
TypeId
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    50
FlameTag::GetInstanceTypeId () const
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    51
{
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    52
  return GetTypeId ();
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    53
}
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    54
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    55
uint32_t
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    56
FlameTag::GetSerializedSize () const
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    57
{
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
    58
  return 12;
5080
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    59
}
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    60
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    61
void
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    62
FlameTag::Serialize (TagBuffer i) const
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    63
{
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    64
  uint8_t buf[6];
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
    65
  receiver.CopyTo (buf);
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
    66
  for (int j = 0; j < 6; j++)
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
    67
    {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
    68
      i.WriteU8 (buf[j]);
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
    69
    }
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
    70
  transmitter.CopyTo (buf);
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
    71
  for (int j = 0; j < 6; j++)
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
    72
    {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
    73
      i.WriteU8 (buf[j]);
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
    74
    }
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
    75
5080
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    76
}
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    77
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    78
void
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    79
FlameTag::Deserialize (TagBuffer i)
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    80
{
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    81
  uint8_t buf[6];
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
    82
  for (int j = 0; j < 6; j++)
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
    83
    {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
    84
      buf[j] = i.ReadU8 ();
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
    85
    }
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
    86
  receiver.CopyFrom (buf);
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
    87
  for (int j = 0; j < 6; j++)
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
    88
    {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
    89
      buf[j] = i.ReadU8 ();
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
    90
    }
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
    91
  transmitter.CopyFrom (buf);
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
    92
5080
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    93
}
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    94
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    95
void
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    96
FlameTag::Print (std::ostream &os) const
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    97
{
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
    98
  os << "receiver = " << receiver << ", transmitter = " << transmitter;
5080
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    99
}
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
   100
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   101
//-----------------------------------------------------------------------------
5095
9ee59991bbef Flame review
Pavel Boyko <boyko@iitp.ru>
parents: 5094
diff changeset
   102
// FlameProtocol
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   103
//-----------------------------------------------------------------------------
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   104
TypeId
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   105
FlameProtocol::GetTypeId ()
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   106
{
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   107
  static TypeId tid = TypeId ("ns3::flame::FlameProtocol")
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   108
    .SetParent<MeshL2RoutingProtocol> ()
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   109
    .AddConstructor<FlameProtocol> ()
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   110
    .AddAttribute ( "BroadcastInterval",
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   111
                    "How often we must send broadcast packets",
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   112
                    TimeValue (Seconds (5)),
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   113
                    MakeTimeAccessor (
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   114
                        &FlameProtocol::m_broadcastInterval),
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   115
                    MakeTimeChecker ()
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   116
                    )
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   117
    .AddAttribute ( "MaxCost",
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   118
                    "Cost threshold after which packet will be dropeed",
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   119
                    UintegerValue (32),
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   120
                    MakeUintegerAccessor (
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   121
                        &FlameProtocol::m_maxCost),
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   122
                    MakeUintegerChecker<uint8_t> (3)
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   123
                    )
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   124
                    ;
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   125
  return tid;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   126
}
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   127
FlameProtocol::FlameProtocol () :
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   128
  m_address (Mac48Address ()), m_broadcastInterval (Seconds (5)), m_lastBroadcast (Simulator::Now ()),
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   129
      m_maxCost (32), m_myLastSeqno (0), m_rtable (CreateObject<FlameRtable> ())
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   130
{
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   131
}
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   132
FlameProtocol::~FlameProtocol ()
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   133
{
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   134
}
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   135
void
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   136
FlameProtocol::DoDispose ()
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   137
{
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   138
}
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   139
bool
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   140
FlameProtocol::RequestRoute (uint32_t sourceIface, const Mac48Address source, const Mac48Address destination,
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   141
    Ptr<const Packet> const_packet, uint16_t protocolType, RouteReplyCallback routeReply)
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   142
{
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   143
  Ptr<Packet> packet = const_packet->Copy ();
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   144
  if (sourceIface == m_mp->GetIfIndex ())
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   145
    {
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   146
      //Packet from upper layer!
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   147
      FlameTag tag;
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   148
      if (packet->PeekPacketTag (tag))
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   149
        {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   150
          NS_FATAL_ERROR ("FLAME tag is not supposed to be received from upper layers");
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   151
        }
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   152
      FlameRtable::LookupResult result = m_rtable->Lookup (destination);
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   153
      if (result.retransmitter == Mac48Address::GetBroadcast ())
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   154
        {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   155
          m_lastBroadcast = Simulator::Now ();
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   156
        }
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   157
      if (m_lastBroadcast + m_broadcastInterval < Simulator::Now ())
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   158
        {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   159
          result.retransmitter = Mac48Address::GetBroadcast ();
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   160
          result.ifIndex = FlameRtable::INTERFACE_ANY;
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   161
          m_lastBroadcast = Simulator::Now ();
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   162
        }
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   163
      FlameHeader flameHdr;
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   164
      flameHdr.AddCost (0);
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   165
      flameHdr.SetSeqno (m_myLastSeqno++);
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   166
      flameHdr.SetProtocol (protocolType);
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   167
      flameHdr.SetOrigDst (destination);
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   168
      flameHdr.SetOrigSrc (source);
5106
de6fe90556c8 Added comments and statistics to flame
Kirill Andreev <andreev@iitp.ru>
parents: 5095
diff changeset
   169
      m_stats.txBytes += packet->GetSize ();
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   170
      packet->AddHeader (flameHdr);
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   171
      tag.receiver = result.retransmitter;
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   172
      if (result.retransmitter == Mac48Address::GetBroadcast ())
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   173
        {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   174
          m_stats.txBroadcast++;
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   175
        }
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   176
      else
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   177
        {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   178
          m_stats.txUnicast++;
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   179
        }
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   180
      NS_LOG_DEBUG ("Source: send packet with RA = " << tag.receiver);
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   181
      packet->AddPacketTag (tag);
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   182
      routeReply (true, packet, source, destination, FLAME_PROTOCOL, result.ifIndex);
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   183
    }
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   184
  else
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   185
    {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   186
      FlameHeader flameHdr;
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   187
      packet->RemoveHeader (flameHdr);
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   188
      FlameTag tag;
5145
7f50ab7ce59d Added path update to FLAME
Kirill Andreev <andreev@iitp.ru>
parents: 5132
diff changeset
   189
      
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   190
      if (!packet->RemovePacketTag (tag))
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   191
        {
5145
7f50ab7ce59d Added path update to FLAME
Kirill Andreev <andreev@iitp.ru>
parents: 5132
diff changeset
   192
          NS_FATAL_ERROR ("FLAME tag must exist here");
7f50ab7ce59d Added path update to FLAME
Kirill Andreev <andreev@iitp.ru>
parents: 5132
diff changeset
   193
        }
7f50ab7ce59d Added path update to FLAME
Kirill Andreev <andreev@iitp.ru>
parents: 5132
diff changeset
   194
      if (HandleDataFrame (flameHdr.GetSeqno (), source, flameHdr, tag.transmitter, sourceIface))
7f50ab7ce59d Added path update to FLAME
Kirill Andreev <andreev@iitp.ru>
parents: 5132
diff changeset
   195
        {
7f50ab7ce59d Added path update to FLAME
Kirill Andreev <andreev@iitp.ru>
parents: 5132
diff changeset
   196
          return false;
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   197
        }
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   198
      if (source == GetAddress ())
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   199
        {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   200
          if (tag.receiver != Mac48Address::GetBroadcast ())
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   201
            {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   202
              NS_LOG_DEBUG ("received packet with SA = GetAddress (), RA = " << tag.receiver << ", TA = "
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   203
                  << tag.transmitter << ", I am " << GetAddress ());
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   204
            }
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   205
          m_stats.totalDropped++;
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   206
          return false;
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   207
        }
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   208
      if (destination == Mac48Address::GetBroadcast ())
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   209
        {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   210
          //Broadcast always is forwarded as broadcast!
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   211
          NS_ASSERT (HandleDataFrame (flameHdr.GetSeqno (), source, flameHdr, tag.transmitter, sourceIface));
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   212
          FlameTag tag (Mac48Address::GetBroadcast ());
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   213
          flameHdr.AddCost (1);
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   214
          m_stats.txBytes += packet->GetSize ();
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   215
          packet->AddHeader (flameHdr);
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   216
          packet->AddPacketTag (tag);
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   217
          routeReply (true, packet, source, destination, FLAME_PROTOCOL, FlameRtable::INTERFACE_ANY);
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   218
          m_stats.txBroadcast++;
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   219
          return true;
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   220
        }
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   221
      else
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   222
        {
5145
7f50ab7ce59d Added path update to FLAME
Kirill Andreev <andreev@iitp.ru>
parents: 5132
diff changeset
   223
          
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   224
          FlameRtable::LookupResult result = m_rtable->Lookup (destination);
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   225
          if (tag.receiver != Mac48Address::GetBroadcast ())
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   226
            {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   227
              if (result.retransmitter == Mac48Address::GetBroadcast ())
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   228
                {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   229
                  NS_LOG_DEBUG ("unicast packet dropped, because no route! I am " << GetAddress ()
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   230
                      << ", RA = " << tag.receiver << ", TA = " << tag.transmitter);
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   231
                  m_stats.totalDropped++;
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   232
                  return false;
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   233
                }
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   234
            }
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   235
          tag.receiver = result.retransmitter;
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   236
          if (result.retransmitter == Mac48Address::GetBroadcast ())
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   237
            {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   238
              m_stats.txBroadcast++;
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   239
            }
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   240
          else
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   241
            {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   242
              m_stats.txUnicast++;
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   243
            }
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   244
          m_stats.txBytes += packet->GetSize ();
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   245
          flameHdr.AddCost (1);
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   246
          packet->AddHeader (flameHdr);
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   247
          packet->AddPacketTag (tag);
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   248
          routeReply (true, packet, source, destination, FLAME_PROTOCOL, result.ifIndex);
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   249
          return true;
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   250
        }
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   251
      return true;
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   252
    }
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   253
  return false;
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   254
}
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   255
bool
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   256
FlameProtocol::RemoveRoutingStuff (uint32_t fromIface, const Mac48Address source,
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   257
    const Mac48Address destination, Ptr<Packet> packet, uint16_t& protocolType)
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   258
{
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   259
  //Filter seqno:
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   260
  if (source == GetAddress ())
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   261
    {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   262
      NS_LOG_DEBUG ("Dropped my own frame!");
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   263
      return false;
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   264
    }
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   265
  FlameTag tag;
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   266
  if (!packet->RemovePacketTag (tag))
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   267
    {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   268
      NS_FATAL_ERROR ("FLAME tag must exist when packet is coming to protocol");
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   269
    }
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   270
  FlameHeader flameHdr;
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   271
  packet->RemoveHeader (flameHdr);
5145
7f50ab7ce59d Added path update to FLAME
Kirill Andreev <andreev@iitp.ru>
parents: 5132
diff changeset
   272
  if ((destination == GetAddress ()) && (m_lastBroadcast + m_broadcastInterval < Simulator::Now ()))
7f50ab7ce59d Added path update to FLAME
Kirill Andreev <andreev@iitp.ru>
parents: 5132
diff changeset
   273
      {
7f50ab7ce59d Added path update to FLAME
Kirill Andreev <andreev@iitp.ru>
parents: 5132
diff changeset
   274
        Ptr<Packet> packet = Create<Packet> ();
7f50ab7ce59d Added path update to FLAME
Kirill Andreev <andreev@iitp.ru>
parents: 5132
diff changeset
   275
        m_mp->Send(packet, Mac48Address::GetBroadcast (), 0);
7f50ab7ce59d Added path update to FLAME
Kirill Andreev <andreev@iitp.ru>
parents: 5132
diff changeset
   276
        m_lastBroadcast = Simulator::Now ();
7f50ab7ce59d Added path update to FLAME
Kirill Andreev <andreev@iitp.ru>
parents: 5132
diff changeset
   277
      }
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   278
  NS_ASSERT (protocolType == FLAME_PROTOCOL);
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   279
  protocolType = flameHdr.GetProtocol ();
5145
7f50ab7ce59d Added path update to FLAME
Kirill Andreev <andreev@iitp.ru>
parents: 5132
diff changeset
   280
  if ((HandleDataFrame (flameHdr.GetSeqno (), source, flameHdr, tag.transmitter, fromIface))
7f50ab7ce59d Added path update to FLAME
Kirill Andreev <andreev@iitp.ru>
parents: 5132
diff changeset
   281
      || packet->GetSize () == 0)
7f50ab7ce59d Added path update to FLAME
Kirill Andreev <andreev@iitp.ru>
parents: 5132
diff changeset
   282
    {
7f50ab7ce59d Added path update to FLAME
Kirill Andreev <andreev@iitp.ru>
parents: 5132
diff changeset
   283
      return false;
7f50ab7ce59d Added path update to FLAME
Kirill Andreev <andreev@iitp.ru>
parents: 5132
diff changeset
   284
    }
7f50ab7ce59d Added path update to FLAME
Kirill Andreev <andreev@iitp.ru>
parents: 5132
diff changeset
   285
  return true;
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   286
}
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   287
bool
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   288
FlameProtocol::Install (Ptr<MeshPointDevice> mp)
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   289
{
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   290
  m_mp = mp;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   291
  std::vector<Ptr<NetDevice> > interfaces = mp->GetInterfaces ();
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   292
  for (std::vector<Ptr<NetDevice> >::const_iterator i = interfaces.begin (); i != interfaces.end (); i++)
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   293
    {
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   294
      // Checking for compatible net device
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   295
      Ptr<WifiNetDevice> wifiNetDev = (*i)->GetObject<WifiNetDevice> ();
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   296
      if (wifiNetDev == 0)
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   297
        {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   298
          return false;
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   299
        }
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   300
      Ptr<MeshWifiInterfaceMac> mac = wifiNetDev->GetMac ()->GetObject<MeshWifiInterfaceMac> ();
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   301
      if (mac == 0)
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   302
        {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   303
          return false;
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   304
        }
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   305
      // Installing plugins:
5086
fccfd0073ea3 Fixed names: now protocols are called *-protocol.[h,cc], plugin is called
Kirill Andreev <andreev@iitp.ru>
parents: 5084
diff changeset
   306
      Ptr<FlameProtocolMac> flameMac = Create<FlameProtocolMac> (wifiNetDev->GetIfIndex (), this);
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   307
      m_interfaces[wifiNetDev->GetIfIndex ()] = flameMac;
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   308
      mac->SetBeaconGeneration (false);
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   309
      mac->InstallPlugin (flameMac);
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   310
    }
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   311
  mp->SetRoutingProtocol (this);
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   312
  // Mesh point aggregates all installed protocols
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   313
  mp->AggregateObject (this);
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   314
  m_address = Mac48Address::ConvertFrom (mp->GetAddress ());//* address;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   315
  return true;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   316
}
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   317
Mac48Address
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   318
FlameProtocol::GetAddress ()
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   319
{
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   320
  return m_address;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   321
}
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   322
bool
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   323
FlameProtocol::HandleDataFrame (uint16_t seqno, Mac48Address source, const FlameHeader flameHdr,
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   324
    Mac48Address receiver, uint32_t fromInterface)
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   325
{
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   326
  if (source == GetAddress ())
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   327
    {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   328
      return true;
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   329
    }
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   330
  FlameRtable::LookupResult result = m_rtable->Lookup (source);
5145
7f50ab7ce59d Added path update to FLAME
Kirill Andreev <andreev@iitp.ru>
parents: 5132
diff changeset
   331
  if ((result.retransmitter != Mac48Address::GetBroadcast ()) && (result.seqnum >= seqno))
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   332
    {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   333
      return true;
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   334
    }
5090
0facd23819b6 Fixed seqno and ttl filter: changed order
Kirill Andreev <andreev@iitp.ru>
parents: 5089
diff changeset
   335
  if (flameHdr.GetCost () > m_maxCost)
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   336
    {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   337
      m_stats.droppedTtl++;
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   338
      return true;
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   339
    }
5088
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   340
  m_rtable->AddPath (source, receiver, fromInterface, flameHdr.GetCost (), flameHdr.GetSeqno ());
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   341
  return false;
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   342
}
5106
de6fe90556c8 Added comments and statistics to flame
Kirill Andreev <andreev@iitp.ru>
parents: 5095
diff changeset
   343
//Statistics:
5126
8e06088a785d Statistics removed from headers
Kirill Andreev <andreev@iitp.ru>
parents: 5106
diff changeset
   344
FlameProtocol::Statistics::Statistics () :
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   345
  txUnicast (0), txBroadcast (0), txBytes (0), droppedTtl (0), totalDropped (0)
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   346
{
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   347
}
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   348
void
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   349
FlameProtocol::Statistics::Print (std::ostream & os) const
5106
de6fe90556c8 Added comments and statistics to flame
Kirill Andreev <andreev@iitp.ru>
parents: 5095
diff changeset
   350
{
de6fe90556c8 Added comments and statistics to flame
Kirill Andreev <andreev@iitp.ru>
parents: 5095
diff changeset
   351
  os << "<Statistics "
de6fe90556c8 Added comments and statistics to flame
Kirill Andreev <andreev@iitp.ru>
parents: 5095
diff changeset
   352
    "txUnicast=\"" << txUnicast << "\" "
de6fe90556c8 Added comments and statistics to flame
Kirill Andreev <andreev@iitp.ru>
parents: 5095
diff changeset
   353
    "txBroadcast=\"" << txBroadcast << "\" "
de6fe90556c8 Added comments and statistics to flame
Kirill Andreev <andreev@iitp.ru>
parents: 5095
diff changeset
   354
    "txBytes=\"" << txBytes << "\" "
de6fe90556c8 Added comments and statistics to flame
Kirill Andreev <andreev@iitp.ru>
parents: 5095
diff changeset
   355
    "droppedTtl=\"" << droppedTtl << "\" "
de6fe90556c8 Added comments and statistics to flame
Kirill Andreev <andreev@iitp.ru>
parents: 5095
diff changeset
   356
    "totalDropped=\"" << totalDropped << "\"/>\n";
de6fe90556c8 Added comments and statistics to flame
Kirill Andreev <andreev@iitp.ru>
parents: 5095
diff changeset
   357
}
de6fe90556c8 Added comments and statistics to flame
Kirill Andreev <andreev@iitp.ru>
parents: 5095
diff changeset
   358
void
de6fe90556c8 Added comments and statistics to flame
Kirill Andreev <andreev@iitp.ru>
parents: 5095
diff changeset
   359
FlameProtocol::Report (std::ostream & os) const
de6fe90556c8 Added comments and statistics to flame
Kirill Andreev <andreev@iitp.ru>
parents: 5095
diff changeset
   360
{
de6fe90556c8 Added comments and statistics to flame
Kirill Andreev <andreev@iitp.ru>
parents: 5095
diff changeset
   361
  os << "<Flame "
de6fe90556c8 Added comments and statistics to flame
Kirill Andreev <andreev@iitp.ru>
parents: 5095
diff changeset
   362
    "address=\"" << m_address << "\"\n"
de6fe90556c8 Added comments and statistics to flame
Kirill Andreev <andreev@iitp.ru>
parents: 5095
diff changeset
   363
    "broadcastInterval=\"" << m_broadcastInterval.GetSeconds () << "\"\n"
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   364
    "maxCost=\"" << (uint16_t) m_maxCost << "\">\n";
5106
de6fe90556c8 Added comments and statistics to flame
Kirill Andreev <andreev@iitp.ru>
parents: 5095
diff changeset
   365
  m_stats.Print (os);
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   366
  for (FlamePluginMap::const_iterator plugin = m_interfaces.begin (); plugin != m_interfaces.end (); plugin++)
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   367
    {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   368
      plugin->second->Report (os);
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   369
    }
5106
de6fe90556c8 Added comments and statistics to flame
Kirill Andreev <andreev@iitp.ru>
parents: 5095
diff changeset
   370
  os << "</Flame>\n";
de6fe90556c8 Added comments and statistics to flame
Kirill Andreev <andreev@iitp.ru>
parents: 5095
diff changeset
   371
}
de6fe90556c8 Added comments and statistics to flame
Kirill Andreev <andreev@iitp.ru>
parents: 5095
diff changeset
   372
void
de6fe90556c8 Added comments and statistics to flame
Kirill Andreev <andreev@iitp.ru>
parents: 5095
diff changeset
   373
FlameProtocol::ResetStats ()
de6fe90556c8 Added comments and statistics to flame
Kirill Andreev <andreev@iitp.ru>
parents: 5095
diff changeset
   374
{
de6fe90556c8 Added comments and statistics to flame
Kirill Andreev <andreev@iitp.ru>
parents: 5095
diff changeset
   375
  m_stats = Statistics ();
5129
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   376
  for (FlamePluginMap::const_iterator plugin = m_interfaces.begin (); plugin != m_interfaces.end (); plugin++)
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   377
    {
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   378
      plugin->second->ResetStats ();
5688b8da4526 Fixed coding style
Kirill Andreev <andreev@iitp.ru>
parents: 5126
diff changeset
   379
    }
5106
de6fe90556c8 Added comments and statistics to flame
Kirill Andreev <andreev@iitp.ru>
parents: 5095
diff changeset
   380
}
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   381
5079
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
   382
} //namespace flame
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
   383
} //namespace ns3