Separate address assignment from routing in PointToPoint topology code
parent
5c5ad7b16a
commit
dc01b2136e
|
@ -122,16 +122,25 @@ int main (int argc, char *argv[])
|
|||
PointToPointTopology::AddIpv4Addresses (
|
||||
channel0, n0, Ipv4Address("10.1.1.1"),
|
||||
n2, Ipv4Address("10.1.1.2"));
|
||||
channel0->Unref ();
|
||||
|
||||
PointToPointTopology::AddIpv4Addresses (
|
||||
channel1, n1, Ipv4Address("10.1.2.1"),
|
||||
n2, Ipv4Address("10.1.2.2"));
|
||||
channel1->Unref ();
|
||||
|
||||
PointToPointTopology::AddIpv4Addresses (
|
||||
channel2, n2, Ipv4Address("10.1.3.1"),
|
||||
n3, Ipv4Address("10.1.3.2"));
|
||||
|
||||
// Finally, we add static routes. These three steps (Channel and
|
||||
// NetDevice creation, IP Address assignment, and routing) are
|
||||
// separated because there may be a need to postpone IP Address
|
||||
// assignment (emulation) or modify to use dynamic routing
|
||||
PointToPointTopology::AddIpv4Routes(n0, n2, channel0);
|
||||
PointToPointTopology::AddIpv4Routes(n1, n2, channel1);
|
||||
PointToPointTopology::AddIpv4Routes(n2, n3, channel2);
|
||||
|
||||
channel0->Unref ();
|
||||
channel1->Unref ();
|
||||
channel2->Unref ();
|
||||
|
||||
// Create the OnOff application to send UDP datagrams of size
|
||||
|
|
|
@ -24,6 +24,8 @@
|
|||
|
||||
#include <algorithm>
|
||||
#include "ns3/assert.h"
|
||||
#include "ns3/debug.h"
|
||||
#include "ns3/fatal-error.h"
|
||||
|
||||
#include "ns3/nstime.h"
|
||||
|
||||
|
@ -62,7 +64,7 @@ PointToPointTopology::AddPointToPointLink(
|
|||
return channel;
|
||||
}
|
||||
|
||||
bool
|
||||
void
|
||||
PointToPointTopology::AddIpv4Addresses(
|
||||
const PointToPointChannel *chan,
|
||||
Node* n1, const Ipv4Address& addr1,
|
||||
|
@ -101,15 +103,82 @@ PointToPointTopology::AddIpv4Addresses(
|
|||
ip2->SetNetworkMask (index2, netmask);
|
||||
ip2->SetUp (index2);
|
||||
|
||||
ip1->AddHostRouteTo (addr2, index1);
|
||||
ip2->AddHostRouteTo (addr1, index2);
|
||||
|
||||
ip1->Unref ();
|
||||
ip2->Unref ();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
PointToPointTopology::AddIpv4Routes (
|
||||
Node* n1, Node* n2, const PointToPointChannel* chan)
|
||||
{
|
||||
// The PointToPoint channel is used to find the relevant NetDevices
|
||||
NS_ASSERT (chan->GetNDevices () == 2);
|
||||
NetDevice* nd1 = chan->GetDevice (0);
|
||||
NetDevice* nd2 = chan->GetDevice (1);
|
||||
// XXX nd1, nd2 should be reference counted
|
||||
|
||||
// Assert that n1 is the Node owning one of the two NetDevices
|
||||
// and make sure that nd1 corresponds to it
|
||||
if (nd1->PeekNode ()->GetId () == n1->GetId ())
|
||||
{
|
||||
; // Do nothing
|
||||
}
|
||||
else if (nd2->PeekNode ()->GetId () == n1->GetId ())
|
||||
{
|
||||
std::swap(nd1, nd2);
|
||||
}
|
||||
else
|
||||
{
|
||||
NS_FATAL_ERROR("P2PTopo: Node does not contain an interface on Channel");
|
||||
}
|
||||
|
||||
// Assert that n2 is the Node owning one of the two NetDevices
|
||||
// and make sure that nd2 corresponds to it
|
||||
if (nd2->PeekNode ()->GetId () != n2->GetId ())
|
||||
{
|
||||
NS_FATAL_ERROR("P2PTopo: Node does not contain an interface on Channel");
|
||||
}
|
||||
|
||||
// Assert that both are Ipv4 nodes
|
||||
IIpv4 *ip1 = nd1->PeekNode ()->QueryInterface<IIpv4> (IIpv4::iid);
|
||||
IIpv4 *ip2 = nd2->PeekNode ()->QueryInterface<IIpv4> (IIpv4::iid);
|
||||
NS_ASSERT(ip1 && ip2);
|
||||
|
||||
// Get interface indexes for both nodes corresponding to the right channel
|
||||
uint32_t index1 = 0;
|
||||
bool found = false;
|
||||
for (uint32_t i = 0; i < ip1->GetNInterfaces (); i++)
|
||||
{
|
||||
if (ip1 ->PeekNetDevice (i) == nd1)
|
||||
{
|
||||
index1 = i;
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
NS_ASSERT(found);
|
||||
|
||||
uint32_t index2 = 0;
|
||||
found = false;
|
||||
for (uint32_t i = 0; i < ip2->GetNInterfaces (); i++)
|
||||
{
|
||||
if (ip2 ->PeekNetDevice (i) == nd2)
|
||||
{
|
||||
index2 = i;
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
NS_ASSERT(found);
|
||||
|
||||
ip1->AddHostRouteTo (ip2-> GetAddress (index2), index1);
|
||||
ip2->AddHostRouteTo (ip1-> GetAddress (index1), index2);
|
||||
|
||||
ip1->Unref ();
|
||||
ip2->Unref ();
|
||||
|
||||
}
|
||||
|
||||
|
||||
#ifdef NOTYET
|
||||
|
||||
// Get the net device connecting node n1 to n2. For topologies where
|
||||
|
|
|
@ -33,30 +33,51 @@ class Node;
|
|||
class IPAddr;
|
||||
class DataRate;
|
||||
class Queue;
|
||||
//class Time;
|
||||
|
||||
/**
|
||||
* \brief A helper class to create Topologies based on the ns3::PointToPointNetDevice and
|
||||
* ns3::PointToPointChannel objects.
|
||||
*
|
||||
* XXX ??
|
||||
* I think that some of the methods below are not implemented.
|
||||
* If so, remove them.
|
||||
* \brief A helper class to create Topologies based on the
|
||||
* ns3::PointToPointNetDevice and ns3::PointToPointChannel objects.
|
||||
*/
|
||||
class PointToPointTopology {
|
||||
public:
|
||||
/**
|
||||
* \param n1 Node
|
||||
* \param n2 Node
|
||||
* \param rate Maximum transmission link rate
|
||||
* \param delay one-way propagation delay
|
||||
* \return Pointer to the underlying PointToPointChannel
|
||||
*
|
||||
* Add a full-duplex point-to-point link between two nodes
|
||||
* with the specified IP addresses, with specified maximum transmission rate
|
||||
* and propagation delay.
|
||||
* and attach PointToPointNetDevices to the resulting
|
||||
* PointToPointChannel.
|
||||
*/
|
||||
static PointToPointChannel* AddPointToPointLink(
|
||||
Node*, Node*, const DataRate&, const Time&);
|
||||
Node* n1, Node* n2, const DataRate& rate, const Time& delay);
|
||||
|
||||
static bool AddIpv4Addresses(
|
||||
const PointToPointChannel*,
|
||||
Node*, const Ipv4Address&,
|
||||
Node*, const Ipv4Address&);
|
||||
/**
|
||||
* \param chan PointToPointChannel to use
|
||||
* \param n1 Node
|
||||
* \param addr1 Ipv4 Address for n1
|
||||
* \param n2 Node
|
||||
* \param addr2 Ipv4 Address for n2
|
||||
*
|
||||
* Add Ipv4Addresses to the Ipv4 interfaces associated with the
|
||||
* two PointToPointNetDevices on the provided PointToPointChannel
|
||||
*/
|
||||
static void AddIpv4Addresses(
|
||||
const PointToPointChannel* chan,
|
||||
Node* n1, const Ipv4Address& addr1,
|
||||
Node* n2, const Ipv4Address& addr2);
|
||||
|
||||
/**
|
||||
* \param chan PointToPointChannel to use
|
||||
* \param n1 Node
|
||||
* \param n2 Node
|
||||
*
|
||||
* For the given PointToPointChannel, for each Node, add an
|
||||
* IPv4 host route to the IPv4 address of the peer node.
|
||||
*/
|
||||
static void AddIpv4Routes (Node*, Node*, const PointToPointChannel*);
|
||||
|
||||
/**
|
||||
* Get the connecting node n1 to node n2
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
*/
|
||||
#include "i-ipv4-impl.h"
|
||||
#include "ipv4.h"
|
||||
#include "ipv4-interface.h"
|
||||
#include "ns3/assert.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
@ -99,6 +100,11 @@ IIpv4Impl::GetNInterfaces (void)
|
|||
{
|
||||
return m_ipv4->GetNInterfaces ();
|
||||
}
|
||||
NetDevice*
|
||||
IIpv4Impl::PeekNetDevice (uint32_t i)
|
||||
{
|
||||
return m_ipv4->GetInterface (i)-> PeekDevice();
|
||||
}
|
||||
|
||||
void
|
||||
IIpv4Impl::SetAddress (uint32_t i, Ipv4Address address)
|
||||
|
|
|
@ -53,6 +53,7 @@ public:
|
|||
virtual void RemoveRoute (uint32_t i);
|
||||
virtual uint32_t AddInterface (NetDevice *device);
|
||||
virtual uint32_t GetNInterfaces (void);
|
||||
virtual NetDevice* PeekNetDevice(uint32_t i);
|
||||
|
||||
virtual void SetAddress (uint32_t i, Ipv4Address address);
|
||||
virtual void SetNetworkMask (uint32_t i, Ipv4Mask mask);
|
||||
|
|
|
@ -122,6 +122,11 @@ public:
|
|||
*/
|
||||
virtual uint32_t GetNInterfaces (void) = 0;
|
||||
|
||||
/**
|
||||
* Return address of the NetDevice associated with the Ipv4Interface
|
||||
*/
|
||||
virtual NetDevice* PeekNetDevice (uint32_t i) = 0;
|
||||
|
||||
virtual void SetAddress (uint32_t i, Ipv4Address address) = 0;
|
||||
virtual void SetNetworkMask (uint32_t i, Ipv4Mask mask) = 0;
|
||||
virtual Ipv4Mask GetNetworkMask (uint32_t t) const = 0;
|
||||
|
|
Loading…
Reference in New Issue