Added flame rtable, fixed DoDispose in HwmpRtable
This commit is contained in:
@@ -42,23 +42,18 @@ HwmpRtable::GetTypeId ()
|
||||
.AddConstructor<HwmpRtable> ();
|
||||
return tid;
|
||||
}
|
||||
|
||||
HwmpRtable::HwmpRtable ()
|
||||
{
|
||||
DeleteProactivePath ();
|
||||
}
|
||||
|
||||
HwmpRtable::~HwmpRtable ()
|
||||
{
|
||||
DoDispose ();
|
||||
}
|
||||
|
||||
void
|
||||
HwmpRtable::DoDispose ()
|
||||
{
|
||||
m_routes.clear ();
|
||||
}
|
||||
|
||||
void
|
||||
HwmpRtable::AddReactivePath (
|
||||
Mac48Address destination,
|
||||
@@ -83,7 +78,6 @@ HwmpRtable::AddReactivePath (
|
||||
i->second.whenExpire = Simulator::Now() + lifetime;
|
||||
i->second.seqnum = seqnum;
|
||||
}
|
||||
|
||||
void
|
||||
HwmpRtable::AddProactivePath (
|
||||
uint32_t metric,
|
||||
@@ -101,7 +95,6 @@ HwmpRtable::AddProactivePath (
|
||||
m_root.seqnum = seqnum;
|
||||
m_root.interface = interface;
|
||||
}
|
||||
|
||||
void
|
||||
HwmpRtable::AddPrecursor (Mac48Address destination, uint32_t precursorInterface, Mac48Address precursorAddress)
|
||||
{
|
||||
@@ -129,7 +122,6 @@ HwmpRtable::AddPrecursor (Mac48Address destination, uint32_t precursorInterface,
|
||||
return;
|
||||
m_root.precursors.push_back(precursor);
|
||||
}
|
||||
|
||||
void
|
||||
HwmpRtable::DeleteProactivePath ()
|
||||
{
|
||||
@@ -140,14 +132,12 @@ HwmpRtable::DeleteProactivePath ()
|
||||
m_root.seqnum = 0;
|
||||
m_root.whenExpire = Simulator::Now ();
|
||||
}
|
||||
|
||||
void
|
||||
HwmpRtable::DeleteProactivePath (Mac48Address root)
|
||||
{
|
||||
if(m_root.root == root)
|
||||
DeleteProactivePath ();
|
||||
}
|
||||
|
||||
void
|
||||
HwmpRtable::DeleteReactivePath (Mac48Address destination)
|
||||
{
|
||||
@@ -155,7 +145,6 @@ HwmpRtable::DeleteReactivePath (Mac48Address destination)
|
||||
if (i != m_routes.end ())
|
||||
m_routes.erase (i);
|
||||
}
|
||||
|
||||
HwmpRtable::LookupResult
|
||||
HwmpRtable::LookupReactive (Mac48Address destination)
|
||||
{
|
||||
@@ -169,7 +158,6 @@ HwmpRtable::LookupReactive (Mac48Address destination)
|
||||
}
|
||||
return LookupReactiveExpired (destination);
|
||||
}
|
||||
|
||||
HwmpRtable::LookupResult
|
||||
HwmpRtable::LookupReactiveExpired (Mac48Address destination)
|
||||
{
|
||||
@@ -183,7 +171,6 @@ HwmpRtable::LookupReactiveExpired (Mac48Address destination)
|
||||
i->second.whenExpire - Simulator::Now ()
|
||||
);
|
||||
}
|
||||
|
||||
HwmpRtable::LookupResult
|
||||
HwmpRtable::LookupProactive ()
|
||||
{
|
||||
@@ -194,13 +181,11 @@ HwmpRtable::LookupProactive ()
|
||||
}
|
||||
return LookupProactiveExpired ();
|
||||
}
|
||||
|
||||
HwmpRtable::LookupResult
|
||||
HwmpRtable::LookupProactiveExpired ()
|
||||
{
|
||||
return LookupResult(m_root.retransmitter, m_root.interface, m_root.metric, m_root.seqnum, m_root.whenExpire - Simulator::Now ());
|
||||
}
|
||||
|
||||
std::vector<IePerr::FailedDestination>
|
||||
HwmpRtable::GetUnreachableDestinations (Mac48Address peerAddress)
|
||||
{
|
||||
@@ -223,7 +208,6 @@ HwmpRtable::GetUnreachableDestinations (Mac48Address peerAddress)
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
HwmpRtable::PrecursorList
|
||||
HwmpRtable::GetPrecursors (Mac48Address destination)
|
||||
{
|
||||
@@ -248,7 +232,6 @@ HwmpRtable::GetPrecursors (Mac48Address destination)
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
bool HwmpRtable::LookupResult::operator==(const HwmpRtable::LookupResult & o) const
|
||||
{
|
||||
return (retransmitter == o.retransmitter
|
||||
@@ -257,7 +240,6 @@ bool HwmpRtable::LookupResult::operator==(const HwmpRtable::LookupResult & o) co
|
||||
&& seqnum == o.seqnum
|
||||
);
|
||||
}
|
||||
|
||||
bool HwmpRtable::LookupResult::IsValid() const
|
||||
{
|
||||
return !( retransmitter == Mac48Address::GetBroadcast ()
|
||||
@@ -266,9 +248,7 @@ bool HwmpRtable::LookupResult::IsValid() const
|
||||
&& seqnum == 0
|
||||
);
|
||||
}
|
||||
|
||||
#ifdef RUN_SELF_TESTS
|
||||
|
||||
/// Unit test for HwmpRtable
|
||||
class HwmpRtableTest : public Test
|
||||
{
|
||||
@@ -305,7 +285,6 @@ private:
|
||||
Ptr<HwmpRtable> table;
|
||||
std::vector<Mac48Address> precursors;
|
||||
};
|
||||
|
||||
/// Test instance
|
||||
static HwmpRtableTest g_HwmpRtableTest;
|
||||
|
||||
@@ -322,7 +301,6 @@ HwmpRtableTest::HwmpRtableTest () : Test ("Mesh/802.11s/HwmpRtable"),
|
||||
precursors.push_back (Mac48Address ("00:11:22:33:44:55"));
|
||||
precursors.push_back (Mac48Address ("00:01:02:03:04:05"));
|
||||
}
|
||||
|
||||
void HwmpRtableTest::TestLookup ()
|
||||
{
|
||||
HwmpRtable::LookupResult correct (hop, iface, metric, seqnum);
|
||||
@@ -339,13 +317,11 @@ void HwmpRtableTest::TestLookup ()
|
||||
table->DeleteProactivePath (dst);
|
||||
NS_TEST_ASSERT (! table->LookupProactive ().IsValid ());
|
||||
}
|
||||
|
||||
void HwmpRtableTest::TestAddPath ()
|
||||
{
|
||||
table->AddReactivePath (dst, hop, iface, metric, expire, seqnum);
|
||||
table->AddProactivePath (metric, dst, hop, iface, expire, seqnum);
|
||||
}
|
||||
|
||||
void HwmpRtableTest::TestExpire ()
|
||||
{
|
||||
// this is assumed to be called when path records are already expired
|
||||
@@ -356,7 +332,6 @@ void HwmpRtableTest::TestExpire ()
|
||||
NS_TEST_ASSERT (! table->LookupReactive (dst).IsValid ());
|
||||
NS_TEST_ASSERT (! table->LookupProactive ().IsValid ());
|
||||
}
|
||||
|
||||
void HwmpRtableTest::TestPrecursorAdd ()
|
||||
{
|
||||
for (std::vector<Mac48Address>::const_iterator i = precursors.begin (); i != precursors.end (); i ++)
|
||||
@@ -366,7 +341,6 @@ void HwmpRtableTest::TestPrecursorAdd ()
|
||||
table->AddPrecursor (dst, iface, *i);
|
||||
}
|
||||
}
|
||||
|
||||
void HwmpRtableTest::TestPrecursorFind ()
|
||||
{
|
||||
HwmpRtable::PrecursorList precursorList = table->GetPrecursors (dst);
|
||||
@@ -392,8 +366,6 @@ bool HwmpRtableTest::RunTests ()
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif // RUN_SELF_TESTS
|
||||
|
||||
} //namespace dot11s
|
||||
} //namespace ns3
|
||||
|
||||
25
src/devices/mesh/flame/flame-protocol-mac.cc
Normal file
25
src/devices/mesh/flame/flame-protocol-mac.cc
Normal file
@@ -0,0 +1,25 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2009 IITP RAS
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Kirill Andreev <andreev@iitp.ru>
|
||||
*/
|
||||
|
||||
#include "flame-protocol-mac.h"
|
||||
namespace ns3 {
|
||||
namespace flame {
|
||||
} //namespace flame
|
||||
} //namespace ns3
|
||||
53
src/devices/mesh/flame/flame-protocol-mac.h
Normal file
53
src/devices/mesh/flame/flame-protocol-mac.h
Normal file
@@ -0,0 +1,53 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2009 IITP RAS
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Kirill Andreev <andreev@iitp.ru>
|
||||
*/
|
||||
|
||||
#ifndef FLAME_PROTOCOL_MAC_H
|
||||
#define FLAME_PROTOCOL_MAC_H
|
||||
|
||||
#include "ns3/mesh-wifi-interface-mac.h"
|
||||
#include "flame-protocol.h"
|
||||
|
||||
namespace ns3 {
|
||||
namespace flame {
|
||||
/**
|
||||
* \ingroup flame
|
||||
*
|
||||
* \brief Interface MAC plugin FLAME routing protocol
|
||||
*/
|
||||
class FlameMacPlugin : public MeshWifiInterfaceMacPlugin
|
||||
{
|
||||
public:
|
||||
FlameMacPlugin (uint32_t, Ptr<FlameProtocol>);
|
||||
~FlameMacPlugin ();
|
||||
///\name Inherited from MAC plugin
|
||||
//\{
|
||||
void SetParent (Ptr<MeshWifiInterfaceMac> parent);
|
||||
bool Receive (Ptr<Packet> packet, const WifiMacHeader & header);
|
||||
bool UpdateOutcomingFrame (Ptr<Packet> packet, WifiMacHeader & header, Mac48Address from, Mac48Address to);
|
||||
/// Update beacon is empty, because HWMP does not know anything about beacons
|
||||
void UpdateBeacon (MeshWifiBeacon & beacon) const {};
|
||||
//\}
|
||||
|
||||
private:
|
||||
|
||||
};
|
||||
} //namespace flame
|
||||
} //namespace ns3
|
||||
#endif /* FLAME_PROTOCOL_MAC_H */
|
||||
25
src/devices/mesh/flame/flame-protocol.cc
Normal file
25
src/devices/mesh/flame/flame-protocol.cc
Normal file
@@ -0,0 +1,25 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2009 IITP RAS
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Kirill Andreev <andreev@iitp.ru>
|
||||
*/
|
||||
|
||||
#include "flame-protocol.h"
|
||||
namespace ns3 {
|
||||
namespace flame {
|
||||
} //namespace flame
|
||||
} //namespace ns3
|
||||
@@ -0,0 +1,60 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2009 IITP RAS
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Kirill Andreev <andreev@iitp.ru>
|
||||
*/
|
||||
|
||||
#ifndef FLAME_PROTOCOL_H
|
||||
#define FLAME_PROTOCOL_H
|
||||
|
||||
#include "ns3/mesh-l2-routing-protocol.h"
|
||||
namespace ns3 {
|
||||
namespace flame {
|
||||
/**
|
||||
* \ingroup flame
|
||||
*
|
||||
* \brief FLAME = Forwarding Layer for Meshing
|
||||
*/
|
||||
|
||||
class FlameProtocol : public MeshL2RoutingProtocol
|
||||
{
|
||||
public:
|
||||
static TypeId GetTypeId ();
|
||||
FlameProtocol ();
|
||||
~FlameProtocol ();
|
||||
void DoDispose ();
|
||||
|
||||
/// Route request, inherited from MeshL2RoutingProtocol
|
||||
bool RequestRoute (uint32_t sourceIface, const Mac48Address source, const Mac48Address destination,
|
||||
Ptr<const Packet> packet, uint16_t protocolType, RouteReplyCallback routeReply);
|
||||
/**
|
||||
* \brief Install FLAME on given mesh point.
|
||||
*
|
||||
* Installing protocol cause installing its interface MAC plugins.
|
||||
*
|
||||
* Also MP aggregates all installed protocols, FLAME protocol can be accessed
|
||||
* via MeshPointDevice::GetObject<dot11s::FlameProtocol>();
|
||||
*/
|
||||
bool Install (Ptr<MeshPointDevice>);
|
||||
///\brief Statistics:
|
||||
void Report (std::ostream &) const;
|
||||
void ResetStats ();
|
||||
private:
|
||||
};
|
||||
} //namespace flame
|
||||
} //namespace ns3
|
||||
#endif /* FLAME_PROTOCOL_H */
|
||||
|
||||
197
src/devices/mesh/flame/flame-rtable.cc
Normal file
197
src/devices/mesh/flame/flame-rtable.cc
Normal file
@@ -0,0 +1,197 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2009 IITP RAS
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Kirill Andreev <andreev@iitp.ru>
|
||||
*/
|
||||
#include "ns3/assert.h"
|
||||
#include "ns3/simulator.h"
|
||||
#include "ns3/test.h"
|
||||
#include "ns3/log.h"
|
||||
|
||||
#include "flame-rtable.h"
|
||||
namespace ns3 {
|
||||
namespace flame {
|
||||
|
||||
NS_LOG_COMPONENT_DEFINE ("FlameRtable");
|
||||
|
||||
NS_OBJECT_ENSURE_REGISTERED (FlameRtable);
|
||||
|
||||
TypeId
|
||||
FlameRtable::GetTypeId ()
|
||||
{
|
||||
static TypeId tid = TypeId ("ns3::flame::FlameRtable")
|
||||
.SetParent<Object> ()
|
||||
.AddConstructor<FlameRtable> ();
|
||||
return tid;
|
||||
}
|
||||
|
||||
FlameRtable::FlameRtable ()
|
||||
: m_lifetime (Seconds (120))
|
||||
{}
|
||||
|
||||
FlameRtable::~FlameRtable ()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
FlameRtable::DoDispose ()
|
||||
{
|
||||
m_routes.clear ();
|
||||
}
|
||||
|
||||
void
|
||||
FlameRtable::AddPath (
|
||||
Mac48Address destination,
|
||||
Mac48Address retransmitter,
|
||||
uint32_t interface,
|
||||
uint8_t cost,
|
||||
uint16_t seqnum
|
||||
)
|
||||
{
|
||||
std::map<Mac48Address, Route>::iterator i = m_routes.find (destination);
|
||||
if (i == m_routes.end ())
|
||||
{
|
||||
Route newroute;
|
||||
newroute.cost = cost;
|
||||
newroute.retransmitter = retransmitter;
|
||||
newroute.interface = interface;
|
||||
newroute.whenExpire = Simulator::Now() + m_lifetime;
|
||||
newroute.seqnum = seqnum;
|
||||
m_routes[destination] = newroute;
|
||||
return;
|
||||
}
|
||||
NS_ASSERT (i != m_routes.end());
|
||||
if (i->second.cost < cost)
|
||||
return;
|
||||
i->second.retransmitter = retransmitter;
|
||||
i->second.interface = interface;
|
||||
i->second.cost = cost;
|
||||
i->second.whenExpire = Simulator::Now() + m_lifetime;
|
||||
i->second.seqnum = seqnum;
|
||||
}
|
||||
FlameRtable::LookupResult
|
||||
FlameRtable::Lookup (Mac48Address destination)
|
||||
{
|
||||
std::map<Mac48Address, Route>::iterator i = m_routes.find (destination);
|
||||
if (i == m_routes.end ())
|
||||
return LookupResult ();
|
||||
if ((i->second.whenExpire < Simulator::Now ()))
|
||||
{
|
||||
NS_LOG_DEBUG ("Route has expired, sorry.");
|
||||
m_routes.erase (i);
|
||||
return LookupResult();
|
||||
}
|
||||
return LookupResult (i->second.retransmitter, i->second.interface, i->second.cost, i->second.seqnum);
|
||||
}
|
||||
bool FlameRtable::LookupResult::operator==(const FlameRtable::LookupResult & o) const
|
||||
{
|
||||
return (retransmitter == o.retransmitter
|
||||
&& ifIndex == o.ifIndex
|
||||
&& cost == o.cost
|
||||
&& seqnum == o.seqnum
|
||||
);
|
||||
}
|
||||
|
||||
bool FlameRtable::LookupResult::IsValid() const
|
||||
{
|
||||
return !( retransmitter == Mac48Address::GetBroadcast ()
|
||||
&& ifIndex == INTERFACE_ANY
|
||||
&& cost == MAX_COST
|
||||
&& seqnum == 0
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
#ifdef RUN_SELF_TESTS
|
||||
/// Unit test for FlameRtable
|
||||
class FlameRtableTest : public Test
|
||||
{
|
||||
public:
|
||||
FlameRtableTest ();
|
||||
virtual bool RunTests();
|
||||
|
||||
private:
|
||||
/// Test Add apth and lookup path;
|
||||
void TestLookup ();
|
||||
/**
|
||||
* \name Test add path and try to lookup after entry has expired
|
||||
* \{
|
||||
*/
|
||||
void TestAddPath ();
|
||||
void TestExpire ();
|
||||
///\}
|
||||
private:
|
||||
bool result;
|
||||
|
||||
Mac48Address dst;
|
||||
Mac48Address hop;
|
||||
uint32_t iface;
|
||||
uint8_t cost;
|
||||
uint16_t seqnum;
|
||||
Ptr<FlameRtable> table;
|
||||
};
|
||||
|
||||
/// Test instance
|
||||
static FlameRtableTest g_FlameRtableTest;
|
||||
|
||||
FlameRtableTest::FlameRtableTest () : Test ("Mesh/flame/FlameRtable"),
|
||||
result(true),
|
||||
dst ("01:00:00:01:00:01"),
|
||||
hop ("01:00:00:01:00:03"),
|
||||
iface (8010),
|
||||
cost (10),
|
||||
seqnum (1)
|
||||
{
|
||||
}
|
||||
|
||||
void FlameRtableTest::TestLookup ()
|
||||
{
|
||||
FlameRtable::LookupResult correct (hop, iface, cost, seqnum);
|
||||
|
||||
table->AddPath (dst, hop, iface, cost, seqnum);
|
||||
NS_TEST_ASSERT (table->Lookup (dst) == correct);
|
||||
}
|
||||
|
||||
void FlameRtableTest::TestAddPath ()
|
||||
{
|
||||
table->AddPath (dst, hop, iface, cost, seqnum);
|
||||
}
|
||||
|
||||
void FlameRtableTest::TestExpire ()
|
||||
{
|
||||
// this is assumed to be called when path records are already expired
|
||||
FlameRtable::LookupResult correct (hop, iface, cost, seqnum);
|
||||
NS_TEST_ASSERT (! table->Lookup (dst).IsValid ());
|
||||
}
|
||||
bool FlameRtableTest::RunTests ()
|
||||
{
|
||||
table = CreateObject<FlameRtable> ();
|
||||
|
||||
Simulator::Schedule (Seconds (0), & FlameRtableTest::TestLookup, this);
|
||||
Simulator::Schedule (Seconds (1), & FlameRtableTest::TestAddPath, this);
|
||||
Simulator::Schedule (Seconds (122), & FlameRtableTest::TestExpire, this);
|
||||
|
||||
Simulator::Run ();
|
||||
Simulator::Destroy ();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif // RUN_SELF_TESTS
|
||||
|
||||
} //namespace flame
|
||||
} //namespace ns3
|
||||
104
src/devices/mesh/flame/flame-rtable.h
Normal file
104
src/devices/mesh/flame/flame-rtable.h
Normal file
@@ -0,0 +1,104 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2009 IITP RAS
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Kirill Andreev <andreev@iitp.ru>
|
||||
*/
|
||||
|
||||
#ifndef FLAME_RTABLE_H
|
||||
#define FLAME_RTABLE_H
|
||||
|
||||
#include <map>
|
||||
#include "ns3/nstime.h"
|
||||
#include "ns3/object.h"
|
||||
#include "ns3/mac48-address.h"
|
||||
|
||||
namespace ns3 {
|
||||
namespace flame {
|
||||
/**
|
||||
* \ingroup flame
|
||||
*
|
||||
* \brief Routing table for FLAME
|
||||
*/
|
||||
class FlameRtable : public Object
|
||||
{
|
||||
public:
|
||||
/// Means all interfaces
|
||||
const static uint32_t INTERFACE_ANY = 0xffffffff;
|
||||
/// Maximum (the best?) path cost
|
||||
const static uint32_t MAX_COST = 0xff;
|
||||
|
||||
/// Route lookup result, return type of LookupXXX methods
|
||||
struct LookupResult
|
||||
{
|
||||
Mac48Address retransmitter;
|
||||
uint32_t ifIndex;
|
||||
uint8_t cost;
|
||||
uint16_t seqnum;
|
||||
LookupResult(Mac48Address r = Mac48Address::GetBroadcast (),
|
||||
uint32_t i = INTERFACE_ANY,
|
||||
uint8_t c = MAX_COST,
|
||||
uint16_t s = 0)
|
||||
: retransmitter (r),
|
||||
ifIndex (i),
|
||||
cost (c),
|
||||
seqnum (s)
|
||||
{
|
||||
}
|
||||
/// True for valid route
|
||||
bool IsValid() const;
|
||||
/// Compare route lookup results, used by tests
|
||||
bool operator==(const LookupResult & o) const;
|
||||
};
|
||||
public:
|
||||
static TypeId GetTypeId ();
|
||||
FlameRtable ();
|
||||
~FlameRtable ();
|
||||
void DoDispose ();
|
||||
|
||||
///\name Add/delete paths
|
||||
//\{
|
||||
void AddPath (
|
||||
Mac48Address destination,
|
||||
Mac48Address retransmitter,
|
||||
uint32_t interface,
|
||||
uint8_t cost,
|
||||
uint16_t seqnum
|
||||
);
|
||||
/**
|
||||
* Lookup path to destination
|
||||
* \returns Broadcast if not found
|
||||
*/
|
||||
LookupResult Lookup (Mac48Address destination);
|
||||
private:
|
||||
/// Routing table entry
|
||||
struct Route
|
||||
{
|
||||
Mac48Address retransmitter;
|
||||
uint32_t interface;
|
||||
uint32_t cost;
|
||||
Time whenExpire;
|
||||
uint32_t seqnum;
|
||||
};
|
||||
/// Lifetime parameter:
|
||||
Time m_lifetime;
|
||||
/// List of routes
|
||||
std::map<Mac48Address, Route> m_routes;
|
||||
};
|
||||
|
||||
} //namespace flame
|
||||
} //namespace ns3
|
||||
#endif /* FLAME_PROTOCOL_H */
|
||||
@@ -4,6 +4,9 @@ def build(bld):
|
||||
obj = bld.create_ns3_module('flame', ['mesh'])
|
||||
obj.source = [
|
||||
'flame-header.cc',
|
||||
'flame-rtable.cc',
|
||||
'flame-protocol-mac.cc',
|
||||
'flame-protocol.cc',
|
||||
]
|
||||
headers = bld.new_task_gen('ns3header')
|
||||
headers.module = 'flame'
|
||||
|
||||
Reference in New Issue
Block a user