src/devices/mesh/flame/flame-protocol.cc
author Kirill Andreev <andreev@iitp.ru>
Thu, 18 Jun 2009 19:50:39 +0400
changeset 5088 fe6fcf14f2a1
parent 5086 fccfd0073ea3
child 5089 785775995505
permissions -rw-r--r--
Flame: added correct seqno filtering, added broadcast timers
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
5079
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
    33
namespace ns3 {
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
    34
namespace flame {
5080
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    35
//-----------------------------------------------------------------------------
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    36
// FlameTag
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
NS_OBJECT_ENSURE_REGISTERED (FlameTag);
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
    39
NS_LOG_COMPONENT_DEFINE ("FlameProtocol");
5080
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    40
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    41
TypeId
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    42
FlameTag::GetTypeId ()
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    43
{
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    44
  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
    45
    .SetParent<Tag> ()
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
    46
    .AddConstructor<FlameTag> ();
5080
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    47
   return tid;
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
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    50
TypeId
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    51
FlameTag::GetInstanceTypeId () const
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    52
{
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    53
  return GetTypeId ();
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
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    56
uint32_t
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    57
FlameTag::GetSerializedSize () const
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    58
{
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    59
  return 6;
5080
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
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    62
void
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    63
FlameTag::Serialize (TagBuffer i) const
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    64
{
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    65
  uint8_t buf[6];
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    66
  address.CopyTo (buf);
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    67
  for (int j = 0; j < 6; j ++)
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    68
    i.WriteU8 (buf[j]);
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    69
}
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    70
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    71
void
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    72
FlameTag::Deserialize (TagBuffer i)
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    73
{
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    74
  uint8_t buf[6];
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    75
  for (int j = 0; j < 6; j ++)
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    76
    buf[j] = i.ReadU8 ();
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    77
  address.CopyFrom (buf);
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
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    80
void
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    81
FlameTag::Print (std::ostream &os) const
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    82
{
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    83
  os << "address = " << address;
5080
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    84
}
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    85
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    86
//-----------------------------------------------------------------------------
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    87
// FlameTag
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    88
//-----------------------------------------------------------------------------
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    89
TypeId
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    90
FlameProtocol::GetTypeId ()
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    91
{
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    92
  static TypeId tid = TypeId ("ns3::flame::FlameProtocol")
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    93
    .SetParent<MeshL2RoutingProtocol> ()
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    94
    .AddConstructor<FlameProtocol> ()
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    95
    .AddAttribute ("BroadcastInterval", "How often we must send broadcast packets",
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    96
        TimeValue (Seconds (5)),
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    97
        MakeTimeAccessor (&FlameProtocol::m_broadcastInterval),
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    98
        MakeTimeChecker ()
5088
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
    99
        )
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   100
    .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
   101
        UintegerValue (32),
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   102
        MakeUintegerAccessor (&FlameProtocol::m_maxCost),
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   103
        MakeUintegerChecker<uint8_t> (3)
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   104
        );
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   105
  return tid;
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
FlameProtocol::FlameProtocol () :
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   108
  m_broadcastInterval (Seconds (5)),
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   109
  m_lastBroadcast (Simulator::Now ()),
5088
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   110
  m_maxCost (32),
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   111
  m_myLastSeqno (0),
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   112
  m_rtable (CreateObject<FlameRtable> ())
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
}
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   115
FlameProtocol::~FlameProtocol ()
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   116
{
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   117
}
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   118
void
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   119
FlameProtocol::DoDispose ()
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   120
{
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   121
}
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   122
bool
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   123
FlameProtocol::RequestRoute (uint32_t  sourceIface, const Mac48Address source, const Mac48Address destination,
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   124
      Ptr<const Packet> const_packet, uint16_t  protocolType, RouteReplyCallback  routeReply)
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   125
{
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   126
  Ptr<Packet> packet = const_packet->Copy ();
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   127
  if (source == m_address)
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   128
  {
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   129
    //Packet from upper layer!
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   130
    FlameTag tag;
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   131
    if(packet->PeekPacketTag (tag))
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   132
    {
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   133
      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
   134
    }
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   135
    FlameHeader flameHdr;
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   136
    tag.address =  m_rtable->Lookup(destination).retransmitter;
5088
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   137
    if(tag.address == Mac48Address::GetBroadcast ())
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   138
      m_lastBroadcast = Simulator::Now ();
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   139
    if(m_lastBroadcast + m_broadcastInterval < Simulator::Now ())
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   140
      tag.address = Mac48Address::GetBroadcast ();
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   141
    flameHdr.AddCost (0);
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   142
    flameHdr.SetSeqno (m_myLastSeqno ++);
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   143
    flameHdr.SetProtocol (protocolType);
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   144
    flameHdr.SetOrigDst (destination);
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   145
    flameHdr.SetOrigSrc (source);
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   146
    packet->AddHeader (flameHdr);
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   147
    packet->AddPacketTag (tag);
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   148
    routeReply (true, packet, source, destination, FLAME_PORT, FlameRtable::INTERFACE_ANY);
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   149
  }
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   150
  else
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   151
  {
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   152
    FlameHeader flameHdr;
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   153
    packet->RemoveHeader (flameHdr); 
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   154
    FlameTag tag;
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   155
    if(!packet->RemovePacketTag (tag))
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   156
    {
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   157
      NS_FATAL_ERROR ("FLAME tag is not supposed to be received by network");
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   158
    }
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   159
    if(destination == Mac48Address::GetBroadcast ())
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   160
    {
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   161
      //Broadcast always is forwarded as broadcast!
5088
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   162
      NS_ASSERT (HandleDataFrame(flameHdr.GetSeqno (), source, flameHdr, tag.address, sourceIface));
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   163
      FlameTag tag (Mac48Address::GetBroadcast ());
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   164
      flameHdr.AddCost (1);
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   165
      packet->AddHeader (flameHdr);
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   166
      packet->AddPacketTag (tag);
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   167
      routeReply (true, packet, source, destination, FLAME_PORT, FlameRtable::INTERFACE_ANY);
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   168
      return true;
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   169
    }
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   170
    else
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   171
    {
5088
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   172
      if(HandleDataFrame(flameHdr.GetSeqno (), source, flameHdr, tag.address, sourceIface))
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   173
        return false;
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   174
      FlameRtable::LookupResult result = m_rtable->Lookup(destination);
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   175
      if(tag.address != Mac48Address::GetBroadcast ())
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   176
      {
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   177
        if(result.retransmitter == Mac48Address::GetBroadcast ())
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   178
          return false;
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   179
      }
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   180
      tag.address = result.retransmitter;
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   181
      flameHdr.AddCost (1);
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   182
      packet->AddHeader (flameHdr);
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   183
      packet->AddPacketTag (tag);
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   184
      routeReply (true, packet, source, destination, FLAME_PORT, result.ifIndex);
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   185
      return true;
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   186
    }
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   187
    return true;
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   188
  }
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   189
  return false;
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   190
}
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   191
bool
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   192
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
   193
      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
   194
{
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   195
  //Filter seqno:
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   196
  if(source == GetAddress ())
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   197
  {
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   198
    NS_LOG_DEBUG("Dropped my own frame!");
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   199
    return false;
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   200
  }
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   201
  FlameTag tag;
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   202
  if(!packet->RemovePacketTag (tag))
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   203
  {
5088
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   204
    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
   205
  }
5088
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   206
  //TODO: send path update
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   207
  FlameHeader flameHdr;
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   208
  packet->RemoveHeader (flameHdr);
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   209
  NS_ASSERT(protocolType == FLAME_PORT);
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   210
  protocolType = flameHdr.GetProtocol ();
5088
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   211
  return (!HandleDataFrame(flameHdr.GetSeqno (), source, flameHdr, tag.address, fromIface));
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   212
}
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   213
bool
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   214
FlameProtocol::Install (Ptr<MeshPointDevice> mp)
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   215
{
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   216
  m_mp = mp;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   217
  std::vector<Ptr<NetDevice> > interfaces = mp->GetInterfaces ();
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   218
  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
   219
    {
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   220
      // Checking for compatible net device
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   221
      Ptr<WifiNetDevice> wifiNetDev = (*i)->GetObject<WifiNetDevice> ();
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   222
      if (wifiNetDev == 0)
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   223
        return false;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   224
      Ptr<MeshWifiInterfaceMac>  mac = wifiNetDev->GetMac ()->GetObject<MeshWifiInterfaceMac> ();
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   225
      if (mac == 0)
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   226
        return false;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   227
      // 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
   228
      Ptr<FlameProtocolMac> flameMac = Create<FlameProtocolMac> (wifiNetDev->GetIfIndex (), this);
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   229
      m_interfaces[wifiNetDev->GetIfIndex ()] = flameMac;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   230
      mac->InstallPlugin (flameMac);
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   231
    }
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   232
  mp->SetRoutingProtocol (this);
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   233
  // Mesh point aggregates all installed protocols
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   234
  mp->AggregateObject (this);
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   235
  m_address = Mac48Address::ConvertFrom (mp->GetAddress ());//* address;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   236
  return true;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   237
}
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   238
Mac48Address
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   239
FlameProtocol::GetAddress ()
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   240
{
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   241
  return m_address;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   242
}
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   243
bool
5088
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   244
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
   245
{
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   246
  if(source == GetAddress ())
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   247
    return true;
5088
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   248
  if (flameHdr.GetCost () > m_maxCost)
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   249
    return true;
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   250
  FlameRtable::LookupResult result = m_rtable->Lookup (source);
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   251
  if (result.retransmitter == Mac48Address::GetBroadcast ())
5088
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   252
  {
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   253
    m_rtable->AddPath (source, receiver, fromInterface, flameHdr.GetCost (), flameHdr.GetSeqno ());
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   254
    return false;
5088
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   255
  }
5084
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   256
  if(result.seqnum >= seqno)
ddf23699f0b7 Initial flame implementation
Kirill Andreev <andreev@iitp.ru>
parents: 5083
diff changeset
   257
    return true;
5088
fe6fcf14f2a1 Flame: added correct seqno filtering, added broadcast timers
Kirill Andreev <andreev@iitp.ru>
parents: 5086
diff changeset
   258
  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
   259
  return false;
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   260
}
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   261
5079
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
   262
} //namespace flame
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
   263
} //namespace ns3