# HG changeset patch # User Artem Krasilov # Date 1458900184 -10800 # Fri Mar 25 13:03:04 2016 +0300 # Node ID 71766cdf6b706bb69d73077b7b2578ab04d3399c # Parent da3e91955f5746358d57665e290750532fa4160b add static function Populating ARP cache diff -r da3e91955f57 -r 71766cdf6b70 src/internet/model/arp-cache.cc --- a/src/internet/model/arp-cache.cc Fri Mar 25 11:10:14 2016 +0300 +++ b/src/internet/model/arp-cache.cc Fri Mar 25 13:03:04 2016 +0300 @@ -25,6 +25,10 @@ #include "ns3/node.h" #include "ns3/trace-source-accessor.h" #include "ns3/names.h" +#include "ns3/node-list.h" +#include "ns3/ipv4-l3-protocol.h" +#include "ns3/object-vector.h" +#include "ns3/pointer.h" #include "arp-cache.h" #include "arp-header.h" @@ -535,5 +539,61 @@ m_retries = 0; } +void +ArpCache::PopulateArpCache () +{ + Ptr dummy = Create (); + Ptr arp = CreateObject (); + arp->SetAliveTimeout (Seconds (3600 * 24 * 365)); + for (NodeList::Iterator i = NodeList::Begin (); i != NodeList::End (); +++i) + { + Ptr ip = (*i)->GetObject (); + NS_ASSERT (ip != 0); + ObjectVectorValue interfaces; + ip->GetAttribute ("InterfaceList", interfaces); + for (ObjectVectorValue::Iterator j = interfaces.Begin (); j != +interfaces.End (); j++) + { + Ptr ipIface = +j->second->GetObject (); + NS_ASSERT (ipIface != 0); + Ptr device = ipIface->GetDevice (); + NS_ASSERT (device != 0); + Mac48Address addr = Mac48Address::ConvertFrom +(device->GetAddress ()); + for (uint32_t k = 0; k < ipIface->GetNAddresses (); k ++) + { + Ipv4Address ipAddr = ipIface->GetAddress (k).GetLocal (); + if (ipAddr == Ipv4Address::GetLoopback ()) + { + continue; + } + Ipv4Header ipHeader; + ArpCache::Entry *entry = arp->Add (ipAddr); + entry->MarkWaitReply (Ipv4PayloadHeaderPair(dummy,ipHeader)); + entry->MarkAlive (addr); + entry->ClearPendingPacket(); + entry->MarkPermanent (); + } + } + } + for (NodeList::Iterator i = NodeList::Begin (); i != NodeList::End (); +++i) + { + Ptr ip = (*i)->GetObject (); + NS_ASSERT (ip != 0); + ObjectVectorValue interfaces; + ip->GetAttribute ("InterfaceList", interfaces); + for (ObjectVectorValue::Iterator j = interfaces.Begin (); j != +interfaces.End (); j ++) + { + Ptr ipIface = +j->second->GetObject (); + ipIface->SetAttribute ("ArpCache", PointerValue (arp)); + } + } +} + } // namespace ns3 diff -r da3e91955f57 -r 71766cdf6b70 src/internet/model/arp-cache.h --- a/src/internet/model/arp-cache.h Fri Mar 25 11:10:14 2016 +0300 +++ b/src/internet/model/arp-cache.h Fri Mar 25 13:03:04 2016 +0300 @@ -173,6 +173,12 @@ */ typedef std::pair, Ipv4Header> Ipv4PayloadHeaderPair; + + /** + * \brief Statically populate ARP cache at all nodes. + */ + static void PopulateArpCache (); + /** * \brief A record that that holds information about an ArpCache entry */