checkpoint
This commit is contained in:
@@ -334,8 +334,8 @@ inode.add_headers ([
|
||||
'ipv4-end-point-demux.h',
|
||||
'ipv4-end-point.h',
|
||||
'ipv4-header.h',
|
||||
'udp-header.h',
|
||||
'ipv4-interface.h',
|
||||
'udp-header.h',
|
||||
'sgi-hashmap.h',
|
||||
'udp-impl.h',
|
||||
])
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include "ns3/net-device.h"
|
||||
#include "ns3/internet-node.h"
|
||||
#include "ns3/ipv4.h"
|
||||
#include "ns3/ipv4-interface.h"
|
||||
#include "static-router.h"
|
||||
|
||||
NS_DEBUG_COMPONENT_DEFINE ("StaticRouter");
|
||||
@@ -90,8 +91,8 @@ StaticRouter::GetNumLSAs (void)
|
||||
// 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");
|
||||
Ptr<Ipv4> ipv4Local = m_node->QueryInterface<Ipv4> (Ipv4::iid);
|
||||
NS_ASSERT_MSG(ipv4Local, "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
|
||||
@@ -104,23 +105,40 @@ StaticRouter::GetNumLSAs (void)
|
||||
// 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)
|
||||
m_numLSAs = 0;
|
||||
uint32_t numDevices = m_node->GetNDevices();
|
||||
NS_DEBUG("StaticRouter::GetNumLSAs (): numDevices = " << numDevices);
|
||||
//
|
||||
// Loop through the devices looking for those connected to a point-to-point
|
||||
// channel. These are the ones that are used to route packets.
|
||||
//
|
||||
for (uint32_t i = 0; i < numDevices; ++i)
|
||||
{
|
||||
Ptr<NetDevice> nd = ipv4->GetNetDevice(i);
|
||||
Ptr<Channel> ch = nd->GetChannel();
|
||||
Ptr<NetDevice> nd = m_node->GetDevice(i);
|
||||
|
||||
if (!nd->IsPointToPoint ())
|
||||
{
|
||||
NS_DEBUG("StaticRouter::GetNumLSAs (): non-point-to-point device");
|
||||
--m_numLSAs;
|
||||
continue;
|
||||
}
|
||||
|
||||
NS_DEBUG("StaticRouter::GetNumLSAs (): point-to-point device");
|
||||
NS_DEBUG("StaticRouter::GetNumLSAs (): Point-to-point device");
|
||||
//
|
||||
// Now, we have to find the Ipv4 interface whose netdevice is the one we
|
||||
// just found. This is the IP on the local side of the channel. There is
|
||||
// a function to do this used down in the guts of the stack, but its not
|
||||
// exported so we had to whip up an equivalent.
|
||||
//
|
||||
uint32_t ifIndexLocal = FindIfIndexForDevice(m_node, nd);
|
||||
//
|
||||
// Now that we have the Ipv4 interface index, we can get the address and mask
|
||||
// we need.
|
||||
//
|
||||
Ipv4Address addrLocal = ipv4Local->GetAddress(ifIndexLocal);
|
||||
Ipv4Mask maskLocal = ipv4Local->GetNetworkMask(ifIndexLocal);
|
||||
NS_DEBUG("Working with local address " << addrLocal);
|
||||
|
||||
Ptr<Channel> ch = nd->GetChannel();
|
||||
//
|
||||
// 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
|
||||
@@ -129,20 +147,23 @@ StaticRouter::GetNumLSAs (void)
|
||||
// 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");
|
||||
Ptr<NetDevice> ndRemote = GetAdjacent(nd, ch);
|
||||
Ptr<Node> nodeRemote = ndRemote->GetNode();
|
||||
Ptr<Ipv4> ipv4Remote = nodeRemote->QueryInterface<Ipv4> (Ipv4::iid);
|
||||
NS_ASSERT_MSG(ipv4Remote, "QI for remote <Ipv4> interface failed");
|
||||
//
|
||||
// Okay, all of the preliminaries are done. We can get the IP address and
|
||||
// net mask for the adjacent router.
|
||||
// Now, just like we did above, we need to get the IP interface index for the
|
||||
// net device on the other end of the point-to-point channel.
|
||||
//
|
||||
Ipv4Address addrAdjacent = ipv4Adjacent->GetAddress(ifIndexAdjacent);
|
||||
Ipv4Mask maskAdjacent = ipv4->GetNetworkMask(ifIndexAdjacent);
|
||||
|
||||
NS_DEBUG("StaticRouter::GetNumLSAs (): Adjacent to " << addrAdjacent <<
|
||||
" & " << maskAdjacent);
|
||||
uint32_t ifIndexRemote = FindIfIndexForDevice(nodeRemote, ndRemote);
|
||||
//
|
||||
// Now that we have the Ipv4 interface, we can get the address and mask we
|
||||
// need.
|
||||
//
|
||||
Ipv4Address addrRemote = ipv4Remote->GetAddress(ifIndexRemote);
|
||||
Ipv4Mask maskRemote = ipv4Remote->GetNetworkMask(ifIndexRemote);
|
||||
NS_DEBUG("Working with remote address " << addrRemote);
|
||||
++m_numLSAs;
|
||||
}
|
||||
|
||||
return m_numLSAs;
|
||||
@@ -191,4 +212,21 @@ StaticRouter::GetAdjacent(Ptr<NetDevice> nd, Ptr<Channel> ch)
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t
|
||||
StaticRouter::FindIfIndexForDevice(Ptr<Node> node, Ptr<NetDevice> nd)
|
||||
{
|
||||
Ptr<Ipv4> ipv4 = node->QueryInterface<Ipv4> (Ipv4::iid);
|
||||
NS_ASSERT_MSG(ipv4, "QI for <Ipv4> interface failed");
|
||||
for (uint32_t i = 0; i < ipv4->GetNInterfaces(); ++i )
|
||||
{
|
||||
if (ipv4->GetNetDevice(i) == nd)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
NS_ASSERT_MSG(0, "Cannot find interface for device");
|
||||
return 0;
|
||||
}
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
@@ -106,6 +106,7 @@ protected:
|
||||
uint32_t m_numLSAs;
|
||||
|
||||
Ptr<NetDevice> GetAdjacent(Ptr<NetDevice> nd, Ptr<Channel> ch);
|
||||
uint32_t FindIfIndexForDevice(Ptr<Node> node, Ptr<NetDevice> nd);
|
||||
|
||||
private:
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user