diff --git a/src/internet/model/ipv4-interface.cc b/src/internet/model/ipv4-interface.cc index 6baef1cc5..ba66108a3 100644 --- a/src/internet/model/ipv4-interface.cc +++ b/src/internet/model/ipv4-interface.cc @@ -31,16 +31,20 @@ NS_OBJECT_ENSURE_REGISTERED(Ipv4Interface); TypeId Ipv4Interface::GetTypeId() { - static TypeId tid = TypeId("ns3::Ipv4Interface") - .SetParent() - .SetGroupName("Internet") - .AddAttribute("ArpCache", - "The arp cache for this ipv4 interface", - PointerValue(nullptr), - MakePointerAccessor(&Ipv4Interface::SetArpCache, - &Ipv4Interface::GetArpCache), - MakePointerChecker()); - ; + static TypeId tid = + TypeId("ns3::Ipv4Interface") + .SetParent() + .SetGroupName("Internet") + .AddAttribute( + "ArpCache", + "The arp cache for this ipv4 interface", + PointerValue(nullptr), + MakePointerAccessor(&Ipv4Interface::SetArpCache, &Ipv4Interface::GetArpCache), + MakePointerChecker()) + .AddTraceSource("InterfaceStatus", + "Interface has been set up or down.", + MakeTraceSourceAccessor(&Ipv4Interface::m_interfaceStatus), + "ns3::Ipv4Address::TracedCallback"); return tid; } @@ -175,6 +179,11 @@ Ipv4Interface::SetUp() { NS_LOG_FUNCTION(this); m_ifup = true; + + Ptr ip = m_node->GetObject(); + NS_ASSERT_MSG(ip, "IPv4 not installed on node."); + auto ifIndex = ip->GetInterfaceForDevice(m_device); + m_interfaceStatus(m_ifup, ifIndex); } void @@ -182,6 +191,11 @@ Ipv4Interface::SetDown() { NS_LOG_FUNCTION(this); m_ifup = false; + + Ptr ip = m_node->GetObject(); + NS_ASSERT_MSG(ip, "IPv4 not installed on node."); + auto ifIndex = ip->GetInterfaceForDevice(m_device); + m_interfaceStatus(m_ifup, ifIndex); } bool diff --git a/src/internet/model/ipv4-interface.h b/src/internet/model/ipv4-interface.h index 3cab0a981..ad9c9950b 100644 --- a/src/internet/model/ipv4-interface.h +++ b/src/internet/model/ipv4-interface.h @@ -12,6 +12,7 @@ #include "ns3/object.h" #include "ns3/ptr.h" +#include "ns3/traced-callback.h" #include @@ -238,6 +239,12 @@ class Ipv4Interface : public Object m_removeAddressCallback; //!< remove address callback Callback, Ipv4InterfaceAddress> m_addAddressCallback; //!< add address callback + + /** + * The trace fired when the interface state changes. + * Includes state (true if interface is up) and the interface index. + */ + ns3::TracedCallback m_interfaceStatus; }; } // namespace ns3 diff --git a/src/internet/model/ipv6-interface.cc b/src/internet/model/ipv6-interface.cc index ee680b0f6..2a3207b93 100644 --- a/src/internet/model/ipv6-interface.cc +++ b/src/internet/model/ipv6-interface.cc @@ -33,7 +33,14 @@ NS_OBJECT_ENSURE_REGISTERED(Ipv6Interface); TypeId Ipv6Interface::GetTypeId() { - static TypeId tid = TypeId("ns3::Ipv6Interface").SetParent().SetGroupName("Internet"); + static TypeId tid = + TypeId("ns3::Ipv6Interface") + .SetParent() + .SetGroupName("Internet") + .AddTraceSource("InterfaceStatus", + "Interface has been set up or down.", + MakeTraceSourceAccessor(&Ipv6Interface::m_interfaceStatus), + "ns3::Ipv6Address::TracedCallback"); return tid; } @@ -170,6 +177,11 @@ Ipv6Interface::SetUp() } DoSetup(); m_ifup = true; + + Ptr ip = m_node->GetObject(); + NS_ASSERT_MSG(ip, "IPv6 not installed on node."); + auto ifIndex = ip->GetInterfaceForDevice(m_device); + m_interfaceStatus(m_ifup, ifIndex); } void @@ -179,6 +191,11 @@ Ipv6Interface::SetDown() m_ifup = false; m_addresses.clear(); m_ndCache->Flush(); + + Ptr ip = m_node->GetObject(); + NS_ASSERT_MSG(ip, "IPv6 not installed on node."); + auto ifIndex = ip->GetInterfaceForDevice(m_device); + m_interfaceStatus(m_ifup, ifIndex); } bool diff --git a/src/internet/model/ipv6-interface.h b/src/internet/model/ipv6-interface.h index c9cee3bda..cad9be968 100644 --- a/src/internet/model/ipv6-interface.h +++ b/src/internet/model/ipv6-interface.h @@ -13,6 +13,7 @@ #include "ns3/object.h" #include "ns3/ptr.h" +#include "ns3/traced-callback.h" #include @@ -386,6 +387,12 @@ class Ipv6Interface : public Object Callback, Ipv6InterfaceAddress> m_addAddressCallback; //!< add address callback + + /** + * The trace fired when the interface state changes. + * Includes state (true if interface is up) and the interface index. + */ + ns3::TracedCallback m_interfaceStatus; }; } /* namespace ns3 */