src/devices/mesh/flame/flame-protocol.cc
author Pavel Boyko <boyko@iitp.ru>
Mon, 22 Jun 2009 14:39:25 +0400
changeset 5095 9ee59991bbef
parent 5094 b98a7a92f020
child 5106 de6fe90556c8
permissions -rw-r--r--
Flame review
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
5079
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
    35
namespace ns3 {
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
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
{
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    45
  static TypeId tid = TypeId ("ns3::flame::FlameTag")
5088
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
    46
    .SetParent<Tag> ()
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
    47
    .AddConstructor<FlameTag> ();
5080
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    48
   return tid;
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    49
}
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    50
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    51
TypeId
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    52
FlameTag::GetInstanceTypeId () const
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
  return GetTypeId ();
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    55
}
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    56
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    57
uint32_t
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    58
FlameTag::GetSerializedSize () const
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    59
{
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
    60
  return 12;
5080
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    61
}
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    62
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    63
void
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    64
FlameTag::Serialize (TagBuffer i) const
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    65
{
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    66
  uint8_t buf[6];
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
    67
  receiver.CopyTo (buf);
5080
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    68
  for (int j = 0; j < 6; j ++)
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    69
    i.WriteU8 (buf[j]);
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
    70
  transmitter.CopyTo (buf);
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
    71
  for (int j = 0; j < 6; j ++)
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
    72
    i.WriteU8 (buf[j]);
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
    73
5080
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    74
}
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    75
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    76
void
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    77
FlameTag::Deserialize (TagBuffer i)
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    78
{
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    79
  uint8_t buf[6];
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    80
  for (int j = 0; j < 6; j ++)
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    81
    buf[j] = i.ReadU8 ();
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
    82
  receiver.CopyFrom (buf);
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
    83
  for (int j = 0; j < 6; j ++)
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
    84
    buf[j] = i.ReadU8 ();
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
    85
  transmitter.CopyFrom (buf);
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
    86
5080
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    87
}
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    88
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    89
void
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    90
FlameTag::Print (std::ostream &os) const
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    91
{
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
    92
  os << "receiver = " << receiver << ", transmitter = " << transmitter;
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
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    95
//-----------------------------------------------------------------------------
5095
9ee59991bbef Flame review
Pavel Boyko <boyko@iitp.ru>
parents: 5094
diff changeset
    96
// FlameProtocol
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    97
//-----------------------------------------------------------------------------
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    98
TypeId
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    99
FlameProtocol::GetTypeId ()
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   100
{
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   101
  static TypeId tid = TypeId ("ns3::flame::FlameProtocol")
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   102
    .SetParent<MeshL2RoutingProtocol> ()
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   103
    .AddConstructor<FlameProtocol> ()
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   104
    .AddAttribute ("BroadcastInterval", "How often we must send broadcast packets",
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   105
        TimeValue (Seconds (5)),
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   106
        MakeTimeAccessor (&FlameProtocol::m_broadcastInterval),
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   107
        MakeTimeChecker ()
5088
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   108
        )
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   109
    .AddAttribute ("MaxCost", "Cost threshold after which packet will be dropeed",
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   110
        UintegerValue (32),
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   111
        MakeUintegerAccessor (&FlameProtocol::m_maxCost),
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   112
        MakeUintegerChecker<uint8_t> (3)
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   113
        );
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   114
  return tid;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   115
}
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   116
FlameProtocol::FlameProtocol () :
5090
0facd23819b6 Fixed seqno and ttl filter: changed order
Kirill Andreev <andreev@iitp.ru>
parents: 5089
diff changeset
   117
  m_address (Mac48Address ()),
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   118
  m_broadcastInterval (Seconds (5)),
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   119
  m_lastBroadcast (Simulator::Now ()),
5088
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   120
  m_maxCost (32),
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   121
  m_myLastSeqno (0),
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   122
  m_rtable (CreateObject<FlameRtable> ())
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   123
{
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   124
}
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   125
FlameProtocol::~FlameProtocol ()
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
}
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   128
void
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   129
FlameProtocol::DoDispose ()
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
bool
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   133
FlameProtocol::RequestRoute (uint32_t  sourceIface, const Mac48Address source, const Mac48Address destination,
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   134
      Ptr<const Packet> const_packet, uint16_t  protocolType, RouteReplyCallback  routeReply)
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   135
{
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   136
  Ptr<Packet> packet = const_packet->Copy ();
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   137
  if (sourceIface == m_mp->GetIfIndex ())
5082
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
    //Packet from upper layer!
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   140
    FlameTag tag;
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   141
    if(packet->PeekPacketTag (tag))
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   142
    {
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   143
      NS_FATAL_ERROR ("FLAME tag is not supposed to be received from upper layers");
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   144
    }
5089
Kirill Andreev <andreev@iitp.ru>
parents: 5088
diff changeset
   145
    FlameRtable::LookupResult result = m_rtable->Lookup(destination);
5094
b98a7a92f020 Broadcast timer bugfix
Kirill Andreev <andreev@iitp.ru>
parents: 5092
diff changeset
   146
    if (result.retransmitter == Mac48Address::GetBroadcast ())
b98a7a92f020 Broadcast timer bugfix
Kirill Andreev <andreev@iitp.ru>
parents: 5092
diff changeset
   147
      m_lastBroadcast = Simulator::Now ();
b98a7a92f020 Broadcast timer bugfix
Kirill Andreev <andreev@iitp.ru>
parents: 5092
diff changeset
   148
    if (m_lastBroadcast + m_broadcastInterval < Simulator::Now ())
5089
Kirill Andreev <andreev@iitp.ru>
parents: 5088
diff changeset
   149
    {
Kirill Andreev <andreev@iitp.ru>
parents: 5088
diff changeset
   150
      result.retransmitter = Mac48Address::GetBroadcast ();
Kirill Andreev <andreev@iitp.ru>
parents: 5088
diff changeset
   151
      result.ifIndex = FlameRtable::INTERFACE_ANY;
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   152
      m_lastBroadcast = Simulator::Now ();
5089
Kirill Andreev <andreev@iitp.ru>
parents: 5088
diff changeset
   153
    }
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   154
    FlameHeader flameHdr;
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   155
    flameHdr.AddCost (0);
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   156
    flameHdr.SetSeqno (m_myLastSeqno ++);
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   157
    flameHdr.SetProtocol (protocolType);
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   158
    flameHdr.SetOrigDst (destination);
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   159
    flameHdr.SetOrigSrc (source);
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   160
    packet->AddHeader (flameHdr);
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   161
    tag.receiver = result.retransmitter;
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   162
    NS_LOG_DEBUG("Source: send packet with RA = " << tag.receiver);
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   163
    packet->AddPacketTag (tag);
5095
9ee59991bbef Flame review
Pavel Boyko <boyko@iitp.ru>
parents: 5094
diff changeset
   164
    routeReply (true, packet, source, destination, FLAME_PROTOCOL, result.ifIndex);
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   165
  }
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   166
  else
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   167
  {
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   168
    FlameHeader flameHdr;
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   169
    packet->RemoveHeader (flameHdr); 
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   170
    FlameTag tag;
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   171
    if(!packet->RemovePacketTag (tag))
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   172
    {
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   173
      NS_FATAL_ERROR ("FLAME tag must exust here");
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   174
    }
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   175
    if(source == GetAddress ())
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   176
    {
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   177
      if(tag.receiver != Mac48Address::GetBroadcast ())
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   178
        NS_LOG_DEBUG(
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   179
            "received packet with SA = GetAddress (), RA = " << tag.receiver << 
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   180
            ", TA = " << tag.transmitter <<
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   181
            ", I am "<<GetAddress ());
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   182
      return false;
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   183
    }
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   184
    if(destination == Mac48Address::GetBroadcast ())
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   185
    {
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   186
      //Broadcast always is forwarded as broadcast!
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   187
      NS_ASSERT (HandleDataFrame(flameHdr.GetSeqno (), source, flameHdr, tag.transmitter, sourceIface));
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   188
      FlameTag tag (Mac48Address::GetBroadcast ());
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   189
      flameHdr.AddCost (1);
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   190
      packet->AddHeader (flameHdr);
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   191
      packet->AddPacketTag (tag);
5095
9ee59991bbef Flame review
Pavel Boyko <boyko@iitp.ru>
parents: 5094
diff changeset
   192
      routeReply (true, packet, source, destination, FLAME_PROTOCOL, FlameRtable::INTERFACE_ANY);
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   193
      return true;
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   194
    }
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   195
    else
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   196
    {
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   197
      if(HandleDataFrame(flameHdr.GetSeqno (), source, flameHdr, tag.transmitter, sourceIface))
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   198
        return false;
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   199
      FlameRtable::LookupResult result = m_rtable->Lookup(destination);
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   200
      if(tag.receiver != Mac48Address::GetBroadcast ())
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   201
      {
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   202
        if(result.retransmitter == Mac48Address::GetBroadcast ())
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   203
        {
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   204
          NS_LOG_DEBUG("unicast packet dropped, because no route! I am "<<GetAddress () << 
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   205
            ", RA = " << tag.receiver << 
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   206
            ", TA = " << tag.transmitter);
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   207
          return false;
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   208
        }
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   209
      }
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   210
      tag.receiver = result.retransmitter;
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   211
      flameHdr.AddCost (1);
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   212
      packet->AddHeader (flameHdr);
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   213
      packet->AddPacketTag (tag);
5095
9ee59991bbef Flame review
Pavel Boyko <boyko@iitp.ru>
parents: 5094
diff changeset
   214
      routeReply (true, packet, source, destination, FLAME_PROTOCOL, result.ifIndex);
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   215
      return true;
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   216
    }
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   217
    return true;
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   218
  }
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   219
  return false;
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   220
}
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   221
bool
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   222
FlameProtocol::RemoveRoutingStuff (uint32_t fromIface, const Mac48Address source,
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   223
      const Mac48Address destination, Ptr<Packet>  packet, uint16_t&  protocolType)
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   224
{
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   225
  //Filter seqno:
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   226
  if(source == GetAddress ())
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   227
  {
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   228
    NS_LOG_DEBUG("Dropped my own frame!");
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   229
    return false;
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   230
  }
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   231
  FlameTag tag;
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   232
  if(!packet->RemovePacketTag (tag))
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   233
  {
5088
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   234
    NS_FATAL_ERROR ("FLAME tag must exist when packet is coming to protocol");
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   235
  }
5088
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   236
  //TODO: send path update
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   237
  FlameHeader flameHdr;
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   238
  packet->RemoveHeader (flameHdr);
5095
9ee59991bbef Flame review
Pavel Boyko <boyko@iitp.ru>
parents: 5094
diff changeset
   239
  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
   240
  protocolType = flameHdr.GetProtocol ();
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   241
  return (!HandleDataFrame(flameHdr.GetSeqno (), source, flameHdr, tag.transmitter, fromIface));
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   242
}
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   243
bool
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   244
FlameProtocol::Install (Ptr<MeshPointDevice> mp)
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   245
{
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   246
  m_mp = mp;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   247
  std::vector<Ptr<NetDevice> > interfaces = mp->GetInterfaces ();
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   248
  for (std::vector<Ptr<NetDevice> >::const_iterator i = interfaces.begin (); i != interfaces.end(); i++)
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   249
    {
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   250
      // Checking for compatible net device
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   251
      Ptr<WifiNetDevice> wifiNetDev = (*i)->GetObject<WifiNetDevice> ();
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   252
      if (wifiNetDev == 0)
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   253
        return false;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   254
      Ptr<MeshWifiInterfaceMac>  mac = wifiNetDev->GetMac ()->GetObject<MeshWifiInterfaceMac> ();
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   255
      if (mac == 0)
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   256
        return false;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   257
      // 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
   258
      Ptr<FlameProtocolMac> flameMac = Create<FlameProtocolMac> (wifiNetDev->GetIfIndex (), this);
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   259
      m_interfaces[wifiNetDev->GetIfIndex ()] = flameMac;
5092
39e4d3a81e1c Flame bugfixes
Kirill Andreev <andreev@iitp.ru>
parents: 5090
diff changeset
   260
      mac->SetBeaconGeneration (false);
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   261
      mac->InstallPlugin (flameMac);
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   262
    }
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   263
  mp->SetRoutingProtocol (this);
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   264
  // Mesh point aggregates all installed protocols
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   265
  mp->AggregateObject (this);
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   266
  m_address = Mac48Address::ConvertFrom (mp->GetAddress ());//* address;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   267
  return true;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   268
}
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   269
Mac48Address
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   270
FlameProtocol::GetAddress ()
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   271
{
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   272
  return m_address;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   273
}
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   274
bool
5088
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   275
FlameProtocol::HandleDataFrame (uint16_t seqno, Mac48Address source, const FlameHeader flameHdr, 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
   276
{
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   277
  if(source == GetAddress ())
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   278
    return true;
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   279
  FlameRtable::LookupResult result = m_rtable->Lookup (source);
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   280
  if (result.retransmitter == Mac48Address::GetBroadcast ())
5088
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   281
  {
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   282
    m_rtable->AddPath (source, receiver, fromInterface, flameHdr.GetCost (), flameHdr.GetSeqno ());
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   283
    return false;
5088
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   284
  }
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   285
  if(result.seqnum >= seqno)
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   286
    return true;
5090
0facd23819b6 Fixed seqno and ttl filter: changed order
Kirill Andreev <andreev@iitp.ru>
parents: 5089
diff changeset
   287
  if (flameHdr.GetCost () > m_maxCost)
0facd23819b6 Fixed seqno and ttl filter: changed order
Kirill Andreev <andreev@iitp.ru>
parents: 5089
diff changeset
   288
    return true;
5088
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   289
  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
   290
  return false;
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   291
}
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   292
5079
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
   293
} //namespace flame
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
   294
} //namespace ns3