checkpoint
This commit is contained in:
@@ -42,6 +42,8 @@
|
||||
#include <string>
|
||||
#include <cassert>
|
||||
|
||||
#include "ns3/debug.h"
|
||||
|
||||
#include "ns3/command-line.h"
|
||||
#include "ns3/default-value.h"
|
||||
#include "ns3/ptr.h"
|
||||
@@ -80,6 +82,7 @@ int main (int argc, char *argv[])
|
||||
DebugComponentEnable("PointToPointChannel");
|
||||
DebugComponentEnable("PointToPointNetDevice");
|
||||
#endif
|
||||
DebugComponentEnable("StaticRouter");
|
||||
|
||||
// Set up some default values for the simulation. Use the Bind()
|
||||
// technique to tell the system what subclass of Queue to use,
|
||||
@@ -152,7 +155,6 @@ int main (int argc, char *argv[])
|
||||
PointToPointTopology::AddIpv4Routes(n1, n2, channel1);
|
||||
PointToPointTopology::AddIpv4Routes(n2, n3, channel2);
|
||||
|
||||
|
||||
// Create the OnOff application to send UDP datagrams of size
|
||||
// 210 bytes at a rate of 448 Kb/s
|
||||
Ptr<OnOffApplication> ooff = Create<OnOffApplication> (
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2007 University of Washington
|
||||
* All rights reserved.
|
||||
*
|
||||
* 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;
|
||||
@@ -15,8 +12,6 @@
|
||||
* 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: Craig Dowell <craigdo@ee.washington.edu>
|
||||
*/
|
||||
|
||||
#include "p2p-channel.h"
|
||||
@@ -32,6 +27,7 @@ namespace ns3 {
|
||||
//
|
||||
// By default, you get a channel with the name "PointToPoint Channel" that
|
||||
// has an "infitely" fast transmission speed and zero delay.
|
||||
//
|
||||
PointToPointChannel::PointToPointChannel()
|
||||
:
|
||||
Channel ("PointToPoint Channel"),
|
||||
@@ -91,7 +87,7 @@ PointToPointChannel::Attach(Ptr<PointToPointNetDevice> device)
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
bool
|
||||
PointToPointChannel::TransmitStart(Packet& p, Ptr<PointToPointNetDevice> src)
|
||||
{
|
||||
NS_DEBUG ("PointToPointChannel::TransmitStart (" << &p << ", " << src <<
|
||||
@@ -116,7 +112,7 @@ PointToPointChannel::TransmitStart(Packet& p, Ptr<PointToPointNetDevice> src)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
bool
|
||||
PointToPointChannel::TransmitEnd(Packet& p, Ptr<PointToPointNetDevice> src)
|
||||
{
|
||||
NS_DEBUG("PointToPointChannel::TransmitEnd (" << &p << ", " << src << ")");
|
||||
@@ -144,7 +140,7 @@ PointToPointChannel::TransmitEnd(Packet& p, Ptr<PointToPointNetDevice> src)
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
PointToPointChannel::PropagationCompleteEvent(
|
||||
Packet p,
|
||||
Ptr<PointToPointNetDevice> src)
|
||||
@@ -162,20 +158,25 @@ PointToPointChannel::PropagationCompleteEvent(
|
||||
m_link[wire].m_dst->Receive (p);
|
||||
}
|
||||
|
||||
|
||||
uint32_t
|
||||
uint32_t
|
||||
PointToPointChannel::GetNDevices (void) const
|
||||
{
|
||||
return m_nDevices;
|
||||
}
|
||||
|
||||
Ptr<NetDevice>
|
||||
Ptr<NetDevice>
|
||||
PointToPointChannel::GetDevice (uint32_t i) const
|
||||
{
|
||||
NS_ASSERT(i < 2);
|
||||
return m_link[i].m_src;
|
||||
}
|
||||
|
||||
Channel::ChannelType
|
||||
PointToPointChannel::GetType (void) const
|
||||
{
|
||||
return Channel::PointToPoint;
|
||||
}
|
||||
|
||||
DataRate
|
||||
PointToPointChannel::GetDataRate (void)
|
||||
{
|
||||
@@ -188,5 +189,4 @@ PointToPointChannel::GetDelay (void)
|
||||
return m_delay;
|
||||
}
|
||||
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2007 University of Washington
|
||||
*
|
||||
* 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;
|
||||
@@ -96,6 +94,8 @@ public:
|
||||
virtual uint32_t GetNDevices (void) const;
|
||||
virtual Ptr<NetDevice> GetDevice (uint32_t i) const;
|
||||
|
||||
virtual ChannelType GetType (void) const;
|
||||
|
||||
virtual DataRate GetDataRate (void);
|
||||
virtual Time GetDelay (void);
|
||||
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2007 University of Washington
|
||||
*
|
||||
* 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;
|
||||
@@ -14,11 +12,8 @@
|
||||
* 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: Craig Dowell <craigdo@ee.washingon.edu>
|
||||
*
|
||||
* Wed Feb 14 16:05:46 PST 2007 craigdo: Created
|
||||
*/
|
||||
|
||||
#ifndef CHANNEL_H
|
||||
#define CHANNEL_H
|
||||
|
||||
@@ -41,6 +36,13 @@ class Channel : public Object
|
||||
{
|
||||
public:
|
||||
static const InterfaceId iid;
|
||||
enum ChannelType
|
||||
{
|
||||
Unknown = 0,
|
||||
PointToPoint,
|
||||
Multipoint
|
||||
};
|
||||
|
||||
Channel ();
|
||||
Channel (std::string name);
|
||||
|
||||
@@ -61,9 +63,18 @@ public:
|
||||
*/
|
||||
virtual Ptr<NetDevice> GetDevice (uint32_t i) const = 0;
|
||||
|
||||
/**
|
||||
* \returns the abstract type of this channel. Right now this is only
|
||||
* PointToPoint (p2p) or Multipoint (Ethernet).
|
||||
*
|
||||
* This method must be implemented by subclasses.
|
||||
*/
|
||||
virtual ChannelType GetType (void) const = 0;
|
||||
|
||||
protected:
|
||||
virtual ~Channel ();
|
||||
std::string m_name;
|
||||
virtual ~Channel ();
|
||||
std::string m_name;
|
||||
ChannelType m_channelType;
|
||||
|
||||
private:
|
||||
};
|
||||
|
||||
@@ -44,6 +44,13 @@ StaticRouteManager::BuildStaticRoutingDatabase ()
|
||||
{
|
||||
Ptr<Node> node = *i;
|
||||
NS_DEBUG_UNCOND ("node="<< node->GetId () );
|
||||
|
||||
Ptr<StaticRouter> rtr =
|
||||
node->QueryInterface<StaticRouter> (StaticRouter::iid);
|
||||
NS_ASSERT_MSG(rtr, "QI for <StaticRouter> interface failed");
|
||||
|
||||
uint32_t numLSAs = rtr->GetNumLSAs();
|
||||
NS_DEBUG_UNCOND (numLSAs << "LSAs");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -84,6 +91,7 @@ StaticRouteManagerTest::RunTests (void)
|
||||
{
|
||||
DebugComponentEnable("StaticRouteManager");
|
||||
bool ok = true;
|
||||
#if 0
|
||||
StaticRouterLinkRecord* lr1 = new StaticRouterLinkRecord();
|
||||
lr1->m_linkId.Set(1);
|
||||
lr1->m_linkData.Set(0xffffffff);
|
||||
@@ -95,6 +103,7 @@ StaticRouteManagerTest::RunTests (void)
|
||||
lsa1->Add(lr1);
|
||||
|
||||
delete lsa1;
|
||||
#endif
|
||||
return ok;
|
||||
}
|
||||
|
||||
|
||||
@@ -15,44 +15,61 @@
|
||||
*/
|
||||
|
||||
#include "ns3/debug.h"
|
||||
#include "ns3/assert.h"
|
||||
#include "ns3/channel.h"
|
||||
#include "ns3/net-device.h"
|
||||
#include "ns3/internet-node.h"
|
||||
#include "ns3/ipv4.h"
|
||||
#include "static-router.h"
|
||||
|
||||
NS_DEBUG_COMPONENT_DEFINE ("StaticRouter");
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
StaticRouterLSA::StaticRouterLSA () :
|
||||
m_linkStateId(0x66666666), m_advertisingRtr(0x66666666)
|
||||
StaticRouterLSA::StaticRouterLSA()
|
||||
:
|
||||
m_linkStateId("0.0.0.0"),
|
||||
m_advertisingRtr("0.0.0.0"),
|
||||
m_linkRecords()
|
||||
{
|
||||
NS_DEBUG("StaticRouterLSA::StaticRouterLSA ()");
|
||||
}
|
||||
StaticRouterLSA::~StaticRouterLSA ()
|
||||
|
||||
StaticRouterLSA::~StaticRouterLSA()
|
||||
{
|
||||
NS_DEBUG("StaticRouterLSA::~StaticRouterLSA ()");
|
||||
for (m_iter = m_listOfLinkRecords.begin();
|
||||
m_iter != m_listOfLinkRecords.end(); m_iter++)
|
||||
{
|
||||
StaticRouterLinkRecord* temp = *m_iter;
|
||||
delete temp;
|
||||
}
|
||||
|
||||
for ( ListOfLinkRecords_t::iterator i = m_linkRecords.begin ();
|
||||
i != m_linkRecords.end ();
|
||||
i++)
|
||||
{
|
||||
NS_DEBUG("StaticRouterLSA::~StaticRouterLSA (): free link record");
|
||||
|
||||
StaticRouterLinkRecord *p = *i;
|
||||
delete p;
|
||||
p = 0;
|
||||
|
||||
*i = 0;
|
||||
}
|
||||
NS_DEBUG("StaticRouterLSA::~StaticRouterLSA (): clear list");
|
||||
m_linkRecords.clear();
|
||||
}
|
||||
|
||||
uint32_t
|
||||
StaticRouterLSA::Add (StaticRouterLinkRecord* lr)
|
||||
uint32_t
|
||||
StaticRouterLSA::AddLinkRecord (StaticRouterLinkRecord* lr)
|
||||
{
|
||||
m_listOfLinkRecords.push_back (lr);
|
||||
return m_listOfLinkRecords.size ();
|
||||
m_linkRecords.push_back (lr);
|
||||
return m_linkRecords.size ();
|
||||
}
|
||||
|
||||
const InterfaceId StaticRouter::iid =
|
||||
MakeInterfaceId ("StaticRouter", Object::iid);
|
||||
|
||||
StaticRouter::StaticRouter (Ptr<Node> node)
|
||||
: m_node(node)
|
||||
: m_node(node), m_numLSAs(0)
|
||||
{
|
||||
SetInterfaceId (StaticRouter::iid);
|
||||
NS_DEBUG("StaticRouter::StaticRouter ()");
|
||||
SetInterfaceId (StaticRouter::iid);
|
||||
}
|
||||
|
||||
StaticRouter::~StaticRouter ()
|
||||
@@ -60,4 +77,118 @@ StaticRouter::~StaticRouter ()
|
||||
NS_DEBUG("StaticRouter::~StaticRouter ()");
|
||||
}
|
||||
|
||||
//
|
||||
// Return the number of Link State Advertisements this node has to advertise.
|
||||
//
|
||||
uint32_t
|
||||
StaticRouter::GetNumLSAs (void)
|
||||
{
|
||||
NS_DEBUG("StaticRouter::GetNumLSAs ()");
|
||||
NS_ASSERT_MSG(m_node, "<Node> interface not set");
|
||||
//
|
||||
// We're aggregated to a node. We need to ask the node for a pointer to its
|
||||
// Ipv4 interface. This is where the information regarding the attached
|
||||
// interfaces lives.
|
||||
//
|
||||
Ptr<Ipv4> ipv4 = m_node->QueryInterface<Ipv4> (Ipv4::iid);
|
||||
NS_ASSERT_MSG(ipv4, "QI for <Ipv4> interface failed");
|
||||
//
|
||||
// Now, we need to ask Ipv4 for the number of interfaces attached to this
|
||||
// node. This isn't necessarily equal to the number of links to adjacent
|
||||
// nodes (other routers); the number of interfaces may include interfaces
|
||||
// connected to stub networks (e.g., ethernets, etc.). So we have to walk
|
||||
// through the list of net devices and see if they are directly connected
|
||||
// to another router.
|
||||
//
|
||||
// We'll start out at the maximum possible number of LSAs and reduce that
|
||||
// number if we discover a link that's not actually connected to another
|
||||
// router.
|
||||
//
|
||||
m_numLSAs = ipv4->GetNInterfaces();
|
||||
|
||||
NS_DEBUG("StaticRouter::GetNumLSAs (): m_numLSAs = " << m_numLSAs);
|
||||
|
||||
for (uint32_t i = 0; i < m_numLSAs; ++i)
|
||||
{
|
||||
Ptr<NetDevice> nd = ipv4->GetNetDevice(i);
|
||||
Ptr<Channel> ch = nd->GetChannel();
|
||||
|
||||
if (!nd->IsPointToPoint ())
|
||||
{
|
||||
NS_DEBUG("StaticRouter::GetNumLSAs (): non-point-to-point device");
|
||||
--m_numLSAs;
|
||||
continue;
|
||||
}
|
||||
|
||||
NS_DEBUG("StaticRouter::GetNumLSAs (): point-to-point device");
|
||||
//
|
||||
// Find the net device on the other end of the point-to-point channel. This
|
||||
// is where our adjacent router is running. The adjacent net device is
|
||||
// aggregated to a node. We need to ask that net device for its node, then
|
||||
// ask that node for its Ipv4 interface and then ask the Ipv4 for the IP
|
||||
// address. To do this, we have to get the interface index associated with
|
||||
// that net device in order to find the correct interface on the adjacent node.
|
||||
//
|
||||
Ptr<NetDevice> ndAdjacent = GetAdjacent(nd, ch);
|
||||
uint32_t ifIndexAdjacent = ndAdjacent->GetIfIndex();
|
||||
Ptr<Node> nodeAdjacent = ndAdjacent->GetNode();
|
||||
Ptr<Ipv4> ipv4Adjacent = nodeAdjacent->QueryInterface<Ipv4> (Ipv4::iid);
|
||||
NS_ASSERT_MSG(ipv4Adjacent, "QI for adjacent <Ipv4> interface failed");
|
||||
//
|
||||
// Okay, all of the preliminaries are done. We can get the IP address and
|
||||
// net mask for the adjacent router.
|
||||
//
|
||||
Ipv4Address addrAdjacent = ipv4Adjacent->GetAddress(ifIndexAdjacent);
|
||||
Ipv4Mask maskAdjacent = ipv4->GetNetworkMask(ifIndexAdjacent);
|
||||
|
||||
NS_DEBUG("StaticRouter::GetNumLSAs (): Adjacent to " << addrAdjacent <<
|
||||
" & " << maskAdjacent);
|
||||
}
|
||||
|
||||
return m_numLSAs;
|
||||
}
|
||||
|
||||
bool
|
||||
StaticRouter::GetLSA (uint32_t n, StaticRouterLSA &lsa)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
Ptr<NetDevice>
|
||||
StaticRouter::GetAdjacent(Ptr<NetDevice> nd, Ptr<Channel> ch)
|
||||
{
|
||||
//
|
||||
// Double-check that channel agrees with device that it's a point-to-point
|
||||
//
|
||||
NS_ASSERT(ch->GetType () == Channel::PointToPoint);
|
||||
|
||||
uint32_t nDevices = ch->GetNDevices();
|
||||
NS_ASSERT_MSG(nDevices == 2,
|
||||
"Point to point channel with other than two devices is not expected");
|
||||
//
|
||||
// This is a point to point channel with two endpoints. Get both of them.
|
||||
//
|
||||
Ptr<NetDevice> nd1 = ch->GetDevice(0);
|
||||
Ptr<NetDevice> nd2 = ch->GetDevice(1);
|
||||
//
|
||||
// One of the endpoints is going to be "us" -- that is the net device attached
|
||||
// to the node on which we're running -- i.e., "nd". The other endpoint (the
|
||||
// one to which we are connected via the channel) is the adjacent router.
|
||||
//
|
||||
if (nd1 == nd)
|
||||
{
|
||||
return nd2;
|
||||
}
|
||||
else if (nd2 == nd)
|
||||
{
|
||||
return nd1;
|
||||
}
|
||||
else
|
||||
{
|
||||
NS_ASSERT_MSG(0,
|
||||
"Neither channel endpoint thinks it is connected to this net device");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include "ns3/object.h"
|
||||
#include "ns3/ptr.h"
|
||||
#include "ns3/node.h"
|
||||
#include "ns3/channel.h"
|
||||
#include "ns3/ipv4-address.h"
|
||||
|
||||
namespace ns3 {
|
||||
@@ -69,16 +70,15 @@ class StaticRouterLSA
|
||||
{
|
||||
public:
|
||||
StaticRouterLSA();
|
||||
virtual ~StaticRouterLSA ();
|
||||
uint32_t Add (StaticRouterLinkRecord* lr);
|
||||
~StaticRouterLSA();
|
||||
|
||||
uint32_t AddLinkRecord (StaticRouterLinkRecord* lr);
|
||||
|
||||
public:
|
||||
Ipv4Address m_linkStateId; // set to the NodeId
|
||||
Ipv4Address m_advertisingRtr; // set to the NodeId
|
||||
|
||||
typedef std::list<StaticRouterLinkRecord*> type_listOfLinkRecords;
|
||||
type_listOfLinkRecords m_listOfLinkRecords;
|
||||
type_listOfLinkRecords::iterator m_iter;
|
||||
typedef std::list<StaticRouterLinkRecord*> ListOfLinkRecords_t;
|
||||
ListOfLinkRecords_t m_linkRecords;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -102,8 +102,12 @@ public:
|
||||
protected:
|
||||
virtual ~StaticRouter ();
|
||||
|
||||
Ptr<Node> m_node;
|
||||
uint32_t m_numLSAs;
|
||||
|
||||
Ptr<NetDevice> GetAdjacent(Ptr<NetDevice> nd, Ptr<Channel> ch);
|
||||
|
||||
private:
|
||||
Ptr<Node> m_node;
|
||||
};
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
Reference in New Issue
Block a user