# HG changeset patch # User Craig Dowell # Date 1184043821 25200 # Node ID ff779ca8ccb619bfe9a00ab660c94794bfaef62c # Parent 9bbf68fe9c0984c43675da79fac7be217ab8a336 checkpoint diff -r 9bbf68fe9c09 -r ff779ca8ccb6 SConstruct --- a/SConstruct Mon Jul 09 15:16:27 2007 -0700 +++ b/SConstruct Mon Jul 09 22:03:41 2007 -0700 @@ -334,8 +334,8 @@ 'ipv4-end-point-demux.h', 'ipv4-end-point.h', 'ipv4-header.h', + 'ipv4-interface.h', 'udp-header.h', - 'ipv4-interface.h', 'sgi-hashmap.h', 'udp-impl.h', ]) diff -r 9bbf68fe9c09 -r ff779ca8ccb6 src/routing/static-router.cc --- a/src/routing/static-router.cc Mon Jul 09 15:16:27 2007 -0700 +++ b/src/routing/static-router.cc Mon Jul 09 22:03:41 2007 -0700 @@ -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 @@ // Ipv4 interface. This is where the information regarding the attached // interfaces lives. // - Ptr ipv4 = m_node->QueryInterface (Ipv4::iid); - NS_ASSERT_MSG(ipv4, "QI for interface failed"); + Ptr ipv4Local = m_node->QueryInterface (Ipv4::iid); + NS_ASSERT_MSG(ipv4Local, "QI for 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 @@ // 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 nd = ipv4->GetNetDevice(i); - Ptr ch = nd->GetChannel(); + Ptr 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 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 @@ // 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 ndAdjacent = GetAdjacent(nd, ch); - uint32_t ifIndexAdjacent = ndAdjacent->GetIfIndex(); - Ptr nodeAdjacent = ndAdjacent->GetNode(); - Ptr ipv4Adjacent = nodeAdjacent->QueryInterface (Ipv4::iid); - NS_ASSERT_MSG(ipv4Adjacent, "QI for adjacent interface failed"); + Ptr ndRemote = GetAdjacent(nd, ch); + Ptr nodeRemote = ndRemote->GetNode(); + Ptr ipv4Remote = nodeRemote->QueryInterface (Ipv4::iid); + NS_ASSERT_MSG(ipv4Remote, "QI for remote interface failed"); +// +// 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. // -// Okay, all of the preliminaries are done. We can get the IP address and -// net mask for the adjacent router. + uint32_t ifIndexRemote = FindIfIndexForDevice(nodeRemote, ndRemote); +// +// Now that we have the Ipv4 interface, we can get the address and mask we +// need. // - Ipv4Address addrAdjacent = ipv4Adjacent->GetAddress(ifIndexAdjacent); - Ipv4Mask maskAdjacent = ipv4->GetNetworkMask(ifIndexAdjacent); - - NS_DEBUG("StaticRouter::GetNumLSAs (): Adjacent to " << addrAdjacent << - " & " << maskAdjacent); + 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 @@ } } + uint32_t +StaticRouter::FindIfIndexForDevice(Ptr node, Ptr nd) +{ + Ptr ipv4 = node->QueryInterface (Ipv4::iid); + NS_ASSERT_MSG(ipv4, "QI for 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 diff -r 9bbf68fe9c09 -r ff779ca8ccb6 src/routing/static-router.h --- a/src/routing/static-router.h Mon Jul 09 15:16:27 2007 -0700 +++ b/src/routing/static-router.h Mon Jul 09 22:03:41 2007 -0700 @@ -106,6 +106,7 @@ uint32_t m_numLSAs; Ptr GetAdjacent(Ptr nd, Ptr ch); + uint32_t FindIfIndexForDevice(Ptr node, Ptr nd); private: };