From bbf9269a146b16ed71fd0604c5eadf6017195945 Mon Sep 17 00:00:00 2001 From: Tim Schubert Date: Sat, 18 Jul 2020 11:55:21 +0200 Subject: [PATCH] Add ARP cache helper --- helper/arp-cache-helper.cc | 54 ++++++++++++++++++++++++++++++++++++++ helper/arp-cache-helper.h | 23 ++++++++++++++++ helper/leo-helper.cc | 15 ++++++++++- helper/nd-cache-helper.cc | 2 ++ wscript | 2 ++ 5 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 helper/arp-cache-helper.cc create mode 100644 helper/arp-cache-helper.h diff --git a/helper/arp-cache-helper.cc b/helper/arp-cache-helper.cc new file mode 100644 index 0000000..75e3367 --- /dev/null +++ b/helper/arp-cache-helper.cc @@ -0,0 +1,54 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ + +#include "ns3/core-module.h" +#include "ns3/network-module.h" +#include "ns3/internet-module.h" +#include "../model/leo-mock-net-device.h" + +#include "arp-cache-helper.h" + +namespace ns3 +{ + +void +ArpCacheHelper::Install (NetDeviceContainer &devices, Ipv4InterfaceContainer &interfaces) const +{ + for (size_t i = 0; i < devices.GetN (); i ++) + { + Ptr dev = devices.Get (i); + Ptr node = dev->GetNode (); + Ptr ipv4 = node->GetObject (); + int32_t ifIndex = ipv4->GetInterfaceForDevice (dev); + Ptr interface = ipv4->GetInterface (ifIndex); + Ptr cache = interface->GetArpCache (); + + 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 (); + Ipv4Address ipaddr = interfaces.GetAddress (otherIfIndex, 1); // IP + + // update cache + ArpCache::Entry* entry = cache->Lookup (ipaddr); + if (entry == 0) + { + entry = cache->Add (ipaddr); + } + entry->SetMacAddress (address); + } + } +} + +}; diff --git a/helper/arp-cache-helper.h b/helper/arp-cache-helper.h new file mode 100644 index 0000000..7349c9f --- /dev/null +++ b/helper/arp-cache-helper.h @@ -0,0 +1,23 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ + +#ifndef ARP_CACHE_HELPER_H +#define ARP_CACHE_HELPER_H + +#include "ns3/core-module.h" +#include "ns3/network-module.h" +#include "ns3/internet-module.h" +#include "ns3/applications-module.h" +#include "ns3/node-container.h" + +namespace ns3 { + +class ArpCacheHelper +{ +public: + void Install (NetDeviceContainer &devices, Ipv4InterfaceContainer &interfaces) const; + void Install (NetDeviceContainer &devicesSrc, NetDeviceContainer &devicesDst, Ipv4InterfaceContainer &interfaces) const; +}; + +}; /* namespace ns3 */ + +#endif /* ARP_CACHE_HELPER */ diff --git a/helper/leo-helper.cc b/helper/leo-helper.cc index cb405e7..da47efb 100644 --- a/helper/leo-helper.cc +++ b/helper/leo-helper.cc @@ -1,7 +1,9 @@ /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ #include "nd-cache-helper.h" - +#include "arp-cache-helper.h" +#include "ns3/ipv4-address-helper.h" +#include "ns3/ipv4-interface-container.h" #include "leo-helper.h" namespace ns3 { @@ -40,6 +42,17 @@ LeoHelper::Install (NodeContainer &satellites, NodeContainer &gateways, NodeCont ndCache.Install (gwNet, gwAddrs); ndCache.Install (utNet, utAddrs); + // Make all networks addressable for legacy protocol + Ipv4AddressHelper legacy; + Ipv4InterfaceContainer islLegacy = legacy.Assign (islNet); + Ipv4InterfaceContainer gwLegacy = legacy.Assign (gwNet); + Ipv4InterfaceContainer utLegacy = legacy.Assign (utNet); + + ArpCacheHelper arpCache; + arpCache.Install (islNet, islLegacy); + arpCache.Install (gwNet, gwLegacy); + arpCache.Install (utNet, utLegacy); + // Add to resulting container of net devices container.Add (islNet); container.Add (gwNet); diff --git a/helper/nd-cache-helper.cc b/helper/nd-cache-helper.cc index bcf94e1..882db2f 100644 --- a/helper/nd-cache-helper.cc +++ b/helper/nd-cache-helper.cc @@ -1,3 +1,5 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ + #include "ns3/core-module.h" #include "ns3/network-module.h" #include "ns3/internet-module.h" diff --git a/wscript b/wscript index 90d06c4..2229324 100644 --- a/wscript +++ b/wscript @@ -9,6 +9,7 @@ def build(bld): module = bld.create_ns3_module('leo', ['core','internet', 'propagation', 'stats', 'traffic', 'flow-monitor', 'applications']) module.source = [ + 'helper/arp-cache-helper.cc', 'helper/isl-helper.cc', 'helper/leo-channel-helper.cc', 'helper/leo-helper.cc', @@ -41,6 +42,7 @@ def build(bld): headers = bld(features='ns3header') headers.module = 'leo' headers.source = [ + 'helper/arp-cache-helper.h', 'helper/isl-helper.h', 'helper/leo-channel-helper.h', 'helper/leo-helper.h',