#include "ns3/core-module.h" #include "ns3/network-module.h" #include "ns3/internet-module.h" #include "../model/leo-mock-net-device.h" #include "nd-cache-helper.h" namespace ns3 { void NdCacheHelper::Install (NetDeviceContainer &devices, Ipv6InterfaceContainer &interfaces) const { // prepare NDS cache for (uint32_t i = 0; i < devices.GetN (); i++) { Ptr dev = devices.Get (i); Ptr node = dev->GetNode (); Ptr ipv6 = node->GetObject (); int32_t ifIndex = ipv6->GetInterfaceForDevice (dev); Ptr interface = ipv6->GetInterface (ifIndex); Ptr cache = interface->GetNdiscCache (); for (uint32_t j = 0; j < devices.GetN (); j++) { // every other device, that is not of same "type" Ptr otherDevice = devices.Get (j); Ptr leoDev = DynamicCast (dev); Ptr otherLeoDev = DynamicCast (otherDevice); if (i == j || (leoDev != 0 && otherLeoDev != 0 && leoDev->GetDeviceType () == otherLeoDev->GetDeviceType ())) { continue; } Address address = otherDevice->GetAddress (); // MAC // and associated address uint32_t otherIfIndex = otherDevice->GetIfIndex (); Ipv6Address ipaddr = interfaces.GetAddress (otherIfIndex, 1); // IP // update cache NdiscCache::Entry* entry = cache->Lookup (ipaddr); if (entry == 0) { entry = cache->Add (ipaddr); } entry->SetMacAddress (address); } } } }; /* namespace ns3 */