src/devices/mesh/flame/flame-protocol.cc
author Kirill Andreev <andreev@iitp.ru>
Thu, 18 Jun 2009 13:50:43 +0400
changeset 5083 5b154b30a8a1
parent 5082 528da3d1e5a4
child 5084 ddf23699f0b7
permissions -rw-r--r--
Restructured L2RoutingProtocol: added cleanup function, which deletes all tags and headers
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-rtable.h"
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    23
#include "flame-header.h"
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
    24
#include "ns3/llc-snap-header.h"
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    25
#include "ns3/log.h"
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    26
#include "ns3/simulator.h"
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    27
#include "ns3/packet.h"
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    28
#include "ns3/mesh-point-device.h"
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    29
#include "ns3/wifi-net-device.h"
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    30
#include "ns3/mesh-point-device.h"
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    31
#include "ns3/mesh-wifi-interface-mac.h"
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    32
#include "ns3/random-variable.h"
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    33
5079
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
    34
namespace ns3 {
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
    35
namespace flame {
5080
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    36
//-----------------------------------------------------------------------------
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    37
// FlameTag
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    38
//-----------------------------------------------------------------------------
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    39
NS_OBJECT_ENSURE_REGISTERED (FlameTag);
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")
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    45
     .SetParent<Tag> ()
f97dc799fea0 Added flame tag
Kirill Andreev <andreev@iitp.ru>
parents: 5079
diff changeset
    46
     .AddConstructor<FlameTag> ();
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 ()
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
    99
        );
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   100
  return tid;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   101
}
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   102
FlameProtocol::FlameProtocol () :
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   103
  m_broadcastInterval (Seconds (5)),
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   104
  m_lastBroadcast (Simulator::Now ()),
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   105
  m_myLastSeqno (0)
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
}
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   108
FlameProtocol::~FlameProtocol ()
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   109
{
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   110
}
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   111
void
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   112
FlameProtocol::DoDispose ()
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
bool
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   116
FlameProtocol::RequestRoute (uint32_t  sourceIface, const Mac48Address source, const Mac48Address destination,
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   117
      Ptr<const Packet> const_packet, uint16_t  protocolType, RouteReplyCallback  routeReply)
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   118
{
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   119
  Ptr<Packet> packet = const_packet->Copy ();
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   120
  if (source == m_address)
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
    //Packet from upper layer!
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   123
    if(destination == Mac48Address::GetBroadcast ())
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
      //Broadcast always is forwarded as broadcast!
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   126
      FlameHeader flameHdr;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   127
      FlameTag tag (Mac48Address::GetBroadcast ());
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   128
      flameHdr.AddCost (0);
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   129
      flameHdr.SetSeqno (m_myLastSeqno ++);
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   130
      flameHdr.SetProtocol (protocolType);
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   131
      flameHdr.SetOrigDst (destination);
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   132
      flameHdr.SetOrigSrc (source);
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   133
      packet->AddHeader (flameHdr);
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   134
      packet->AddPacketTag (tag);
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   135
      routeReply (true, packet, source, destination, FLAME_PORT, FlameRtable::INTERFACE_ANY);
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   136
    }
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   137
    else
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   138
      NS_FATAL_ERROR ("unicast not done yet!");
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   139
  }
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   140
  else
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   141
  {
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   142
    FlameHeader flameHdr;
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   143
    packet->RemoveHeader (flameHdr); 
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   144
    //if(DropDataFrame(flameHdr.GetSeqno (), source))
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   145
    //  return false;
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   146
    if(destination == Mac48Address::GetBroadcast ())
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   147
    {
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   148
      //Broadcast always is forwarded as broadcast!
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   149
      //Broadcast was filtered in RemoveRoutingStuff, because mesh
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   150
      //point device first calss it
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   151
      FlameTag tag (Mac48Address::GetBroadcast ());
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   152
      flameHdr.AddCost (1);
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   153
      packet->AddHeader (flameHdr);
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   154
      packet->AddPacketTag (tag);
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   155
      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
   156
      return true;
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   157
    }
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   158
    else
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   159
    {
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   160
      if(DropDataFrame(flameHdr.GetSeqno (), source))
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   161
        return false;
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   162
      NS_FATAL_ERROR ("not done yet!");
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   163
    }
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   164
    return true;
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   165
  }
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   166
  return false;
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   167
}
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   168
bool
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   169
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
   170
      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
   171
{
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   172
  //Filter seqno:
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   173
  FlameHeader flameHdr;
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   174
  packet->RemoveHeader (flameHdr);
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   175
  NS_ASSERT(protocolType == FLAME_PORT);
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   176
  protocolType = flameHdr.GetProtocol ();
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   177
  if(DropDataFrame(flameHdr.GetSeqno (), source))
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   178
    return false;
5082
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   179
  return true;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   180
}
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   181
bool
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   182
FlameProtocol::Install (Ptr<MeshPointDevice> mp)
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   183
{
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   184
  m_mp = mp;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   185
  std::vector<Ptr<NetDevice> > interfaces = mp->GetInterfaces ();
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   186
  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
   187
    {
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   188
      // Checking for compatible net device
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   189
      Ptr<WifiNetDevice> wifiNetDev = (*i)->GetObject<WifiNetDevice> ();
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   190
      if (wifiNetDev == 0)
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   191
        return false;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   192
      Ptr<MeshWifiInterfaceMac>  mac = wifiNetDev->GetMac ()->GetObject<MeshWifiInterfaceMac> ();
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   193
      if (mac == 0)
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   194
        return false;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   195
      // Installing plugins:
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   196
      Ptr<FlameMacPlugin> flameMac = Create<FlameMacPlugin> (wifiNetDev->GetIfIndex (), this);
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   197
      m_interfaces[wifiNetDev->GetIfIndex ()] = flameMac;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   198
      mac->InstallPlugin (flameMac);
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   199
    }
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   200
  mp->SetRoutingProtocol (this);
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   201
  // Mesh point aggregates all installed protocols
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   202
  mp->AggregateObject (this);
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   203
  m_address = Mac48Address::ConvertFrom (mp->GetAddress ());//* address;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   204
  return true;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   205
}
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   206
Mac48Address
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   207
FlameProtocol::GetAddress ()
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   208
{
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   209
  return m_address;
528da3d1e5a4 Flame stack initialized
Kirill Andreev <andreev@iitp.ru>
parents: 5080
diff changeset
   210
}
5083
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   211
bool
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   212
FlameProtocol::DropDataFrame(uint16_t seqno, Mac48Address source)
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   213
{
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   214
  if(source == GetAddress ())
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   215
    return true;
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   216
  std::map<Mac48Address, uint16_t,std::less<Mac48Address> >::const_iterator i = m_lastSeqno.find (source);
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   217
  if (i == m_lastSeqno.end ())
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   218
    m_lastSeqno[source] = seqno;
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   219
  else
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
    if (i->second >= seqno)
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   222
      return true;
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   223
    m_lastSeqno[source] = seqno;
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
  return false;
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   226
}
5b154b30a8a1 Restructured L2RoutingProtocol: added cleanup function, which deletes all tags
Kirill Andreev <andreev@iitp.ru>
parents: 5082
diff changeset
   227
5079
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
   228
} //namespace flame
245215e5e6ed Added flame rtable, fixed DoDispose in HwmpRtable
Kirill Andreev <andreev@iitp.ru>
parents:
diff changeset
   229
} //namespace ns3