# HG changeset patch # User Mathieu Lacage # Date 1244839459 25200 # Node ID 2f106fd728abc3acd18ea24baff9edf14ec3917b # Parent 51fb48b38c2fbc29be20af9d4aefd0111e79ddef Remove static routing dependencies in code diff -r 51fb48b38c2f -r 2f106fd728ab bindings/python/ns3_module_internet_stack.py --- a/bindings/python/ns3_module_internet_stack.py Fri Jun 19 09:17:08 2009 +0200 +++ b/bindings/python/ns3_module_internet_stack.py Fri Jun 12 13:44:19 2009 -0700 @@ -541,6 +541,31 @@ 'bool', [param('ns3::Ptr< ns3::Packet const >', 'p'), param('ns3::Ipv4Header const &', 'header'), param('ns3::Ptr< ns3::NetDevice const >', 'idev'), param('ns3::Callback< void, ns3::Ptr< ns3::Ipv4Route >, ns3::Ptr< ns3::Packet const >, ns3::Ipv4Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ucb'), param('ns3::Callback< void, ns3::Ptr< ns3::Ipv4MulticastRoute >, ns3::Ptr< ns3::Packet const >, ns3::Ipv4Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'mcb'), param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv4Header const &, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'lcb'), param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv4Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ecb')], is_virtual=True) + ## ipv4-static-routing-impl.h: void ns3::Ipv4StaticRoutingImpl::NotifyInterfaceUp(uint32_t interface) [member function] + cls.add_method('NotifyInterfaceUp', + 'void', + [param('uint32_t', 'interface')], + is_virtual=True) + ## ipv4-static-routing-impl.h: void ns3::Ipv4StaticRoutingImpl::NotifyInterfaceDown(uint32_t interface) [member function] + cls.add_method('NotifyInterfaceDown', + 'void', + [param('uint32_t', 'interface')], + is_virtual=True) + ## ipv4-static-routing-impl.h: void ns3::Ipv4StaticRoutingImpl::NotifyAddAddress(uint32_t interface, ns3::Ipv4InterfaceAddress address) [member function] + cls.add_method('NotifyAddAddress', + 'void', + [param('uint32_t', 'interface'), param('ns3::Ipv4InterfaceAddress', 'address')], + is_virtual=True) + ## ipv4-static-routing-impl.h: void ns3::Ipv4StaticRoutingImpl::NotifyRemoveAddress(uint32_t interface, ns3::Ipv4InterfaceAddress address) [member function] + cls.add_method('NotifyRemoveAddress', + 'void', + [param('uint32_t', 'interface'), param('ns3::Ipv4InterfaceAddress', 'address')], + is_virtual=True) + ## ipv4-static-routing-impl.h: void ns3::Ipv4StaticRoutingImpl::SetIpv4(ns3::Ptr ipv4) [member function] + cls.add_method('SetIpv4', + 'void', + [param('ns3::Ptr< ns3::Ipv4 >', 'ipv4')], + is_virtual=True) ## ipv4-static-routing-impl.h: void ns3::Ipv4StaticRoutingImpl::AddHostRouteTo(ns3::Ipv4Address dest, ns3::Ipv4Address nextHop, uint32_t interface) [member function] cls.add_method('AddHostRouteTo', 'void', @@ -616,16 +641,6 @@ 'void', [param('uint32_t', 'index')], is_virtual=True) - ## ipv4-static-routing-impl.h: void ns3::Ipv4StaticRoutingImpl::SetNode(ns3::Ptr node) [member function] - cls.add_method('SetNode', - 'void', - [param('ns3::Ptr< ns3::Node >', 'node')], - is_virtual=True) - ## ipv4-static-routing-impl.h: ns3::Ptr ns3::Ipv4StaticRoutingImpl::GetNode() const [member function] - cls.add_method('GetNode', - 'ns3::Ptr< ns3::Node >', - [], - is_const=True, is_virtual=True) ## ipv4-static-routing-impl.h: void ns3::Ipv4StaticRoutingImpl::DoDispose() [member function] cls.add_method('DoDispose', 'void', @@ -653,6 +668,31 @@ 'bool', [param('ns3::Ptr< ns3::Packet const >', 'p'), param('ns3::Ipv4Header const &', 'header'), param('ns3::Ptr< ns3::NetDevice const >', 'idev'), param('ns3::Callback< void, ns3::Ptr< ns3::Ipv4Route >, ns3::Ptr< ns3::Packet const >, ns3::Ipv4Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ucb'), param('ns3::Callback< void, ns3::Ptr< ns3::Ipv4MulticastRoute >, ns3::Ptr< ns3::Packet const >, ns3::Ipv4Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'mcb'), param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv4Header const &, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'lcb'), param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv4Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ecb')], is_virtual=True) + ## ipv4-list-routing-impl.h: void ns3::Ipv4ListRoutingImpl::NotifyInterfaceUp(uint32_t interface) [member function] + cls.add_method('NotifyInterfaceUp', + 'void', + [param('uint32_t', 'interface')], + is_virtual=True) + ## ipv4-list-routing-impl.h: void ns3::Ipv4ListRoutingImpl::NotifyInterfaceDown(uint32_t interface) [member function] + cls.add_method('NotifyInterfaceDown', + 'void', + [param('uint32_t', 'interface')], + is_virtual=True) + ## ipv4-list-routing-impl.h: void ns3::Ipv4ListRoutingImpl::NotifyAddAddress(uint32_t interface, ns3::Ipv4InterfaceAddress address) [member function] + cls.add_method('NotifyAddAddress', + 'void', + [param('uint32_t', 'interface'), param('ns3::Ipv4InterfaceAddress', 'address')], + is_virtual=True) + ## ipv4-list-routing-impl.h: void ns3::Ipv4ListRoutingImpl::NotifyRemoveAddress(uint32_t interface, ns3::Ipv4InterfaceAddress address) [member function] + cls.add_method('NotifyRemoveAddress', + 'void', + [param('uint32_t', 'interface'), param('ns3::Ipv4InterfaceAddress', 'address')], + is_virtual=True) + ## ipv4-list-routing-impl.h: void ns3::Ipv4ListRoutingImpl::SetIpv4(ns3::Ptr ipv4) [member function] + cls.add_method('SetIpv4', + 'void', + [param('ns3::Ptr< ns3::Ipv4 >', 'ipv4')], + is_virtual=True) ## ipv4-list-routing-impl.h: void ns3::Ipv4ListRoutingImpl::AddRoutingProtocol(ns3::Ptr routingProtocol, int16_t priority) [member function] cls.add_method('AddRoutingProtocol', 'void', @@ -673,15 +713,6 @@ 'ns3::Ptr< ns3::Ipv4StaticRouting >', [], is_const=True, is_virtual=True) - ## ipv4-list-routing-impl.h: void ns3::Ipv4ListRoutingImpl::SetNode(ns3::Ptr node) [member function] - cls.add_method('SetNode', - 'void', - [param('ns3::Ptr< ns3::Node >', 'node')]) - ## ipv4-list-routing-impl.h: ns3::Ptr ns3::Ipv4ListRoutingImpl::GetNode() const [member function] - cls.add_method('GetNode', - 'ns3::Ptr< ns3::Node >', - [], - is_const=True) ## ipv4-list-routing-impl.h: void ns3::Ipv4ListRoutingImpl::DoDispose() [member function] cls.add_method('DoDispose', 'void', diff -r 51fb48b38c2f -r 2f106fd728ab bindings/python/ns3_module_node.py --- a/bindings/python/ns3_module_node.py Fri Jun 19 09:17:08 2009 +0200 +++ b/bindings/python/ns3_module_node.py Fri Jun 12 13:44:19 2009 -0700 @@ -2855,6 +2855,31 @@ 'bool', [param('ns3::Ptr< ns3::Packet const >', 'p'), param('ns3::Ipv4Header const &', 'header'), param('ns3::Ptr< ns3::NetDevice const >', 'idev'), param('ns3::Callback< void, ns3::Ptr< ns3::Ipv4Route >, ns3::Ptr< ns3::Packet const >, ns3::Ipv4Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ucb'), param('ns3::Callback< void, ns3::Ptr< ns3::Ipv4MulticastRoute >, ns3::Ptr< ns3::Packet const >, ns3::Ipv4Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'mcb'), param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv4Header const &, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'lcb'), param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv4Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ecb')], is_pure_virtual=True, is_virtual=True) + ## ipv4-routing-protocol.h: void ns3::Ipv4RoutingProtocol::NotifyInterfaceUp(uint32_t interface) [member function] + cls.add_method('NotifyInterfaceUp', + 'void', + [param('uint32_t', 'interface')], + is_pure_virtual=True, is_virtual=True) + ## ipv4-routing-protocol.h: void ns3::Ipv4RoutingProtocol::NotifyInterfaceDown(uint32_t interface) [member function] + cls.add_method('NotifyInterfaceDown', + 'void', + [param('uint32_t', 'interface')], + is_pure_virtual=True, is_virtual=True) + ## ipv4-routing-protocol.h: void ns3::Ipv4RoutingProtocol::NotifyAddAddress(uint32_t interface, ns3::Ipv4InterfaceAddress address) [member function] + cls.add_method('NotifyAddAddress', + 'void', + [param('uint32_t', 'interface'), param('ns3::Ipv4InterfaceAddress', 'address')], + is_pure_virtual=True, is_virtual=True) + ## ipv4-routing-protocol.h: void ns3::Ipv4RoutingProtocol::NotifyRemoveAddress(uint32_t interface, ns3::Ipv4InterfaceAddress address) [member function] + cls.add_method('NotifyRemoveAddress', + 'void', + [param('uint32_t', 'interface'), param('ns3::Ipv4InterfaceAddress', 'address')], + is_pure_virtual=True, is_virtual=True) + ## ipv4-routing-protocol.h: void ns3::Ipv4RoutingProtocol::SetIpv4(ns3::Ptr ipv4) [member function] + cls.add_method('SetIpv4', + 'void', + [param('ns3::Ptr< ns3::Ipv4 >', 'ipv4')], + is_pure_virtual=True, is_virtual=True) return def register_Ns3Ipv4StaticRouting_methods(root_module, cls): @@ -2942,16 +2967,6 @@ 'void', [param('uint32_t', 'index')], is_pure_virtual=True, is_virtual=True) - ## ipv4-static-routing.h: void ns3::Ipv4StaticRouting::SetNode(ns3::Ptr node) [member function] - cls.add_method('SetNode', - 'void', - [param('ns3::Ptr< ns3::Node >', 'node')], - is_pure_virtual=True, is_virtual=True) - ## ipv4-static-routing.h: ns3::Ptr ns3::Ipv4StaticRouting::GetNode() const [member function] - cls.add_method('GetNode', - 'ns3::Ptr< ns3::Node >', - [], - is_pure_virtual=True, is_const=True, is_virtual=True) return def register_Ns3NetDevice_methods(root_module, cls): diff -r 51fb48b38c2f -r 2f106fd728ab bindings/python/ns3_module_olsr.py --- a/bindings/python/ns3_module_olsr.py Fri Jun 19 09:17:08 2009 +0200 +++ b/bindings/python/ns3_module_olsr.py Fri Jun 12 13:44:19 2009 -0700 @@ -747,10 +747,6 @@ is_static=True) ## olsr-routing-protocol.h: ns3::olsr::RoutingProtocol::RoutingProtocol() [constructor] cls.add_constructor([]) - ## olsr-routing-protocol.h: void ns3::olsr::RoutingProtocol::SetNode(ns3::Ptr node) [member function] - cls.add_method('SetNode', - 'void', - [param('ns3::Ptr< ns3::Node >', 'node')]) ## olsr-routing-protocol.h: void ns3::olsr::RoutingProtocol::Start() [member function] cls.add_method('Start', 'void', @@ -769,6 +765,31 @@ 'bool', [param('ns3::Ptr< ns3::Packet const >', 'p'), param('ns3::Ipv4Header const &', 'header'), param('ns3::Ptr< ns3::NetDevice const >', 'idev'), param('ns3::Callback< void, ns3::Ptr< ns3::Ipv4Route >, ns3::Ptr< ns3::Packet const >, ns3::Ipv4Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ucb'), param('ns3::Callback< void, ns3::Ptr< ns3::Ipv4MulticastRoute >, ns3::Ptr< ns3::Packet const >, ns3::Ipv4Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'mcb'), param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv4Header const &, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'lcb'), param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv4Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ecb')], visibility='private', is_virtual=True) + ## olsr-routing-protocol.h: void ns3::olsr::RoutingProtocol::NotifyInterfaceUp(uint32_t interface) [member function] + cls.add_method('NotifyInterfaceUp', + 'void', + [param('uint32_t', 'interface')], + visibility='private', is_virtual=True) + ## olsr-routing-protocol.h: void ns3::olsr::RoutingProtocol::NotifyInterfaceDown(uint32_t interface) [member function] + cls.add_method('NotifyInterfaceDown', + 'void', + [param('uint32_t', 'interface')], + visibility='private', is_virtual=True) + ## olsr-routing-protocol.h: void ns3::olsr::RoutingProtocol::NotifyAddAddress(uint32_t interface, ns3::Ipv4InterfaceAddress address) [member function] + cls.add_method('NotifyAddAddress', + 'void', + [param('uint32_t', 'interface'), param('ns3::Ipv4InterfaceAddress', 'address')], + visibility='private', is_virtual=True) + ## olsr-routing-protocol.h: void ns3::olsr::RoutingProtocol::NotifyRemoveAddress(uint32_t interface, ns3::Ipv4InterfaceAddress address) [member function] + cls.add_method('NotifyRemoveAddress', + 'void', + [param('uint32_t', 'interface'), param('ns3::Ipv4InterfaceAddress', 'address')], + visibility='private', is_virtual=True) + ## olsr-routing-protocol.h: void ns3::olsr::RoutingProtocol::SetIpv4(ns3::Ptr ipv4) [member function] + cls.add_method('SetIpv4', + 'void', + [param('ns3::Ptr< ns3::Ipv4 >', 'ipv4')], + visibility='private', is_virtual=True) ## olsr-routing-protocol.h: void ns3::olsr::RoutingProtocol::DoDispose() [member function] cls.add_method('DoDispose', 'void', diff -r 51fb48b38c2f -r 2f106fd728ab src/helper/internet-stack-helper.cc --- a/src/helper/internet-stack-helper.cc Fri Jun 19 09:17:08 2009 +0200 +++ b/src/helper/internet-stack-helper.cc Fri Jun 12 13:44:19 2009 -0700 @@ -244,10 +244,8 @@ // XXX cut this over to use of TypeIds and factories Ptr ipv4RoutingImpl = CreateObject (); Ptr ipv4staticRoutingImpl = CreateObject (); - ipv4staticRoutingImpl->SetNode (node); ipv4RoutingImpl->AddRoutingProtocol (ipv4staticRoutingImpl, 0); ipv4->SetRoutingProtocol (ipv4RoutingImpl); - ipv4RoutingImpl->SetNode (node); } void diff -r 51fb48b38c2f -r 2f106fd728ab src/helper/olsr-helper.cc --- a/src/helper/olsr-helper.cc Fri Jun 19 09:17:08 2009 +0200 +++ b/src/helper/olsr-helper.cc Fri Jun 12 13:44:19 2009 -0700 @@ -76,7 +76,6 @@ Ptr ipv4Routing = DynamicCast (ipv4->GetRoutingProtocol ()); NS_ASSERT (ipv4Routing); ipv4Routing->AddRoutingProtocol (agent, 10); - agent->SetNode (node); agent->Start (); } void diff -r 51fb48b38c2f -r 2f106fd728ab src/internet-stack/ipv4-l3-protocol.cc --- a/src/internet-stack/ipv4-l3-protocol.cc Fri Jun 19 09:17:08 2009 +0200 +++ b/src/internet-stack/ipv4-l3-protocol.cc Fri Jun 12 13:44:19 2009 -0700 @@ -163,12 +163,7 @@ { NS_LOG_FUNCTION (this); m_routingProtocol = routingProtocol; - // XXX should check all interfaces to see if any were set to Up state - // prior to a routing protocol being added - if (GetStaticRouting () != 0) - { - GetStaticRouting ()->AddHostRouteTo (Ipv4Address::GetLoopback (), 0); - } + m_routingProtocol->SetIpv4 (this); } @@ -230,11 +225,11 @@ Ptr node = GetObject (); node->RegisterProtocolHandler (MakeCallback (&Ipv4L3Protocol::Receive, this), Ipv4L3Protocol::PROT_NUMBER, device); - if (GetStaticRouting () != 0) + interface->SetUp (); + if (m_routingProtocol != 0) { - GetStaticRouting ()->AddHostRouteTo (Ipv4Address::GetLoopback (), index); + m_routingProtocol->NotifyInterfaceUp (index); } - interface->SetUp (); } void @@ -244,26 +239,6 @@ m_defaultTtl = ttl; } -// XXX need to remove dependencies on Ipv4StaticRouting from this class -Ptr -Ipv4L3Protocol::GetStaticRouting (void) const -{ - NS_LOG_FUNCTION_NOARGS (); - Ptr staticRouting; - if (m_routingProtocol != 0) - { - Ptr sr = DynamicCast (m_routingProtocol); - if (sr != 0) - { - return sr; - } - Ptr lr = DynamicCast (m_routingProtocol); - NS_ASSERT (lr); - staticRouting = lr->GetStaticRouting (); - } - return staticRouting; -} - uint32_t Ipv4L3Protocol::AddInterface (Ptr device) { @@ -761,7 +736,12 @@ { NS_LOG_FUNCTION (this << i << address); Ptr interface = GetInterface (i); - return interface->AddAddress (address); + uint32_t index = interface->AddAddress (address); + if (m_routingProtocol != 0) + { + m_routingProtocol->NotifyAddAddress (i, address); + } + return index; } Ipv4InterfaceAddress @@ -819,18 +799,9 @@ Ptr interface = GetInterface (i); interface->SetUp (); - // If interface address and network mask have been set, add a route - // to the network of the interface (like e.g. ifconfig does on a - // Linux box) - for (uint32_t j = 0; j < interface->GetNAddresses (); j++) + if (m_routingProtocol != 0) { - if (((interface->GetAddress (j).GetLocal ()) != (Ipv4Address ())) - && (interface->GetAddress (j).GetMask ()) != (Ipv4Mask ())) - { - NS_ASSERT_MSG (GetStaticRouting(), "SetUp:: No static routing"); - GetStaticRouting ()->AddNetworkRouteTo (interface->GetAddress (j).GetLocal ().CombineMask (interface->GetAddress (j).GetMask ()), - interface->GetAddress (j).GetMask (), i); - } + m_routingProtocol->NotifyInterfaceUp (i); } } @@ -841,21 +812,9 @@ Ptr interface = GetInterface (ifaceIndex); interface->SetDown (); - // Remove all static routes that are going through this interface - bool modified = true; - while (modified) + if (m_routingProtocol != 0) { - modified = false; - for (uint32_t i = 0; i < GetStaticRouting ()->GetNRoutes (); i++) - { - Ipv4RoutingTableEntry route = GetStaticRouting ()->GetRoute (i); - if (route.GetInterface () == ifaceIndex) - { - GetStaticRouting ()->RemoveRoute (i); - modified = true; - break; - } - } + m_routingProtocol->NotifyInterfaceDown (ifaceIndex); } } diff -r 51fb48b38c2f -r 2f106fd728ab src/internet-stack/ipv4-l3-protocol.h --- a/src/internet-stack/ipv4-l3-protocol.h Fri Jun 19 09:17:08 2009 +0200 +++ b/src/internet-stack/ipv4-l3-protocol.h Fri Jun 12 13:44:19 2009 -0700 @@ -218,7 +218,6 @@ TracedCallback > m_dropTrace; Ptr m_routingProtocol; - Ptr GetStaticRouting (void) const; SocketList m_sockets; }; diff -r 51fb48b38c2f -r 2f106fd728ab src/internet-stack/ipv4-list-routing-impl.cc --- a/src/internet-stack/ipv4-list-routing-impl.cc Fri Jun 19 09:17:08 2009 +0200 +++ b/src/internet-stack/ipv4-list-routing-impl.cc Fri Jun 12 13:44:19 2009 -0700 @@ -42,7 +42,7 @@ Ipv4ListRoutingImpl::Ipv4ListRoutingImpl () - : m_node (0) + : m_ipv4 (0) { NS_LOG_FUNCTION_NOARGS (); } @@ -65,7 +65,7 @@ (*rprotoIter).second = 0; } m_routingProtocols.clear (); - m_node = 0; + m_ipv4 = 0; } Ptr @@ -102,18 +102,17 @@ { bool retVal = false; NS_LOG_FUNCTION (p << header << idev); - NS_LOG_LOGIC ("RouteInput logic for node: " << m_node->GetId ()); + NS_LOG_LOGIC ("RouteInput logic for node: " << m_ipv4->GetObject ()->GetId ()); - Ptr ipv4 = m_node->GetObject (); - NS_ASSERT (ipv4); - uint32_t iif = ipv4->GetInterfaceForDevice (idev); + NS_ASSERT (m_ipv4 != 0); + uint32_t iif = m_ipv4->GetInterfaceForDevice (idev); // Multicast recognition; handle local delivery here // if (header.GetDestination().IsMulticast ()) { #ifdef NOTYET - if (ipv4->MulticastCheckGroup (iif, header.GetDestination ())) + if (m_ipv4->MulticastCheckGroup (iif, header.GetDestination ())) #endif if (true) { @@ -152,11 +151,11 @@ // destination unicast address does not match one of the iif addresses, // but we check our other interfaces. This could be an option // (to remove the outer loop immediately below and just check iif). - for (uint32_t j = 0; j < ipv4->GetNInterfaces (); j++) + for (uint32_t j = 0; j < m_ipv4->GetNInterfaces (); j++) { - for (uint32_t i = 0; i < ipv4->GetNAddresses (j); i++) + for (uint32_t i = 0; i < m_ipv4->GetNAddresses (j); i++) { - Ipv4InterfaceAddress iaddr = ipv4->GetAddress (j, i); + Ipv4InterfaceAddress iaddr = m_ipv4->GetAddress (j, i); Ipv4Address addr = iaddr.GetLocal (); if (addr.IsEqual (header.GetDestination ())) { @@ -195,13 +194,79 @@ return retVal; } +void +Ipv4ListRoutingImpl::NotifyInterfaceUp (uint32_t interface) +{ + NS_LOG_FUNCTION (this << interface); + for (Ipv4RoutingProtocolList::const_iterator rprotoIter = + m_routingProtocols.begin (); + rprotoIter != m_routingProtocols.end (); + rprotoIter++) + { + (*rprotoIter).second->NotifyInterfaceUp (interface); + } +} +void +Ipv4ListRoutingImpl::NotifyInterfaceDown (uint32_t interface) +{ + NS_LOG_FUNCTION (this << interface); + for (Ipv4RoutingProtocolList::const_iterator rprotoIter = + m_routingProtocols.begin (); + rprotoIter != m_routingProtocols.end (); + rprotoIter++) + { + (*rprotoIter).second->NotifyInterfaceDown (interface); + } +} +void +Ipv4ListRoutingImpl::NotifyAddAddress (uint32_t interface, Ipv4InterfaceAddress address) +{ + NS_LOG_FUNCTION(this << interface << address); + for (Ipv4RoutingProtocolList::const_iterator rprotoIter = + m_routingProtocols.begin (); + rprotoIter != m_routingProtocols.end (); + rprotoIter++) + { + (*rprotoIter).second->NotifyAddAddress (interface, address); + } +} +void +Ipv4ListRoutingImpl::NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress address) +{ + NS_LOG_FUNCTION(this << interface << address); + for (Ipv4RoutingProtocolList::const_iterator rprotoIter = + m_routingProtocols.begin (); + rprotoIter != m_routingProtocols.end (); + rprotoIter++) + { + (*rprotoIter).second->NotifyRemoveAddress (interface, address); + } +} +void +Ipv4ListRoutingImpl::SetIpv4 (Ptr ipv4) +{ + NS_LOG_FUNCTION(this << ipv4); + NS_ASSERT (m_ipv4 == 0); + for (Ipv4RoutingProtocolList::const_iterator rprotoIter = + m_routingProtocols.begin (); + rprotoIter != m_routingProtocols.end (); + rprotoIter++) + { + (*rprotoIter).second->SetIpv4 (ipv4); + } + m_ipv4 = ipv4; +} + void Ipv4ListRoutingImpl::AddRoutingProtocol (Ptr routingProtocol, int16_t priority) { NS_LOG_FUNCTION (this << routingProtocol->GetInstanceTypeId () << priority); - m_routingProtocols.push_back - (std::pair > (-priority, routingProtocol)); + m_routingProtocols.push_back (std::make_pair (-priority, routingProtocol)); m_routingProtocols.sort (); + if (m_ipv4 != 0) + { + routingProtocol->SetIpv4 (m_ipv4); + } } uint32_t @@ -253,19 +318,4 @@ } -void -Ipv4ListRoutingImpl::SetNode (Ptr node) -{ - NS_LOG_FUNCTION_NOARGS (); - m_node = node; -} - -Ptr -Ipv4ListRoutingImpl::GetNode (void) const -{ - NS_LOG_FUNCTION_NOARGS (); - return m_node; -} - - }//namespace ns3 diff -r 51fb48b38c2f -r 2f106fd728ab src/internet-stack/ipv4-list-routing-impl.h --- a/src/internet-stack/ipv4-list-routing-impl.h Fri Jun 19 09:17:08 2009 +0200 +++ b/src/internet-stack/ipv4-list-routing-impl.h Fri Jun 12 13:44:19 2009 -0700 @@ -39,6 +39,11 @@ virtual bool RouteInput (Ptr p, const Ipv4Header &header, Ptr idev, UnicastForwardCallback ucb, MulticastForwardCallback mcb, LocalDeliverCallback lcb, ErrorCallback ecb); + virtual void NotifyInterfaceUp (uint32_t interface); + virtual void NotifyInterfaceDown (uint32_t interface); + virtual void NotifyAddAddress (uint32_t interface, Ipv4InterfaceAddress address); + virtual void NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress address); + virtual void SetIpv4 (Ptr ipv4); virtual void AddRoutingProtocol (Ptr routingProtocol, int16_t priority); @@ -47,16 +52,12 @@ virtual Ptr GetRoutingProtocol (uint32_t index, int16_t& priority) const; virtual Ptr GetStaticRouting (void) const; - - void SetNode (Ptr node); - Ptr GetNode (void) const; - protected: void DoDispose (void); private: - typedef std::list< std::pair< int, Ptr > > Ipv4RoutingProtocolList; + typedef std::list< std::pair< int16_t, Ptr > > Ipv4RoutingProtocolList; Ipv4RoutingProtocolList m_routingProtocols; - Ptr m_node; + Ptr m_ipv4; }; diff -r 51fb48b38c2f -r 2f106fd728ab src/internet-stack/ipv4-static-routing-impl.cc --- a/src/internet-stack/ipv4-static-routing-impl.cc Fri Jun 19 09:17:08 2009 +0200 +++ b/src/internet-stack/ipv4-static-routing-impl.cc Fri Jun 12 13:44:19 2009 -0700 @@ -42,7 +42,7 @@ } Ipv4StaticRoutingImpl::Ipv4StaticRoutingImpl () -: m_defaultRoute (0), m_node (0) +: m_defaultRoute (0), m_ipv4 (0) { NS_LOG_FUNCTION_NOARGS (); } @@ -222,15 +222,14 @@ if ((*i)->GetDest ().IsEqual (dest)) { NS_LOG_LOGIC ("Found global host route" << *i); - Ptr ipv4 = m_node->GetObject (); Ipv4RoutingTableEntry* route = (*i); rtentry = Create (); rtentry->SetDestination (route->GetDest ()); // XXX handle multi-address case - rtentry->SetSource (ipv4->GetAddress (route->GetInterface(), 0).GetLocal ()); + rtentry->SetSource (m_ipv4->GetAddress (route->GetInterface(), 0).GetLocal ()); rtentry->SetGateway (route->GetGateway ()); uint32_t interfaceIdx = route->GetInterface (); - rtentry->SetOutputDevice (ipv4->GetNetDevice (interfaceIdx)); + rtentry->SetOutputDevice (m_ipv4->GetNetDevice (interfaceIdx)); return rtentry; } } @@ -244,15 +243,14 @@ if (mask.IsMatch (dest, entry)) { NS_LOG_LOGIC ("Found global network route" << *j); - Ptr ipv4 = m_node->GetObject (); Ipv4RoutingTableEntry* route = (*j); rtentry = Create (); rtentry->SetDestination (route->GetDest ()); // XXX handle multi-address case - rtentry->SetSource (ipv4->GetAddress (route->GetInterface(), 0).GetLocal ()); + rtentry->SetSource (m_ipv4->GetAddress (route->GetInterface(), 0).GetLocal ()); rtentry->SetGateway (route->GetGateway ()); uint32_t interfaceIdx = route->GetInterface (); - rtentry->SetOutputDevice (ipv4->GetNetDevice (interfaceIdx)); + rtentry->SetOutputDevice (m_ipv4->GetNetDevice (interfaceIdx)); return rtentry; } } @@ -260,15 +258,14 @@ { NS_ASSERT (m_defaultRoute->IsDefault ()); NS_LOG_LOGIC ("Found global network route" << m_defaultRoute); - Ptr ipv4 = m_node->GetObject (); Ipv4RoutingTableEntry* route = m_defaultRoute; rtentry = Create (); rtentry->SetDestination (route->GetDest ()); // XXX handle multi-address case - rtentry->SetSource (ipv4->GetAddress (route->GetInterface(), 0).GetLocal ()); + rtentry->SetSource (m_ipv4->GetAddress (route->GetInterface(), 0).GetLocal ()); rtentry->SetGateway (route->GetGateway ()); uint32_t interfaceIdx = route->GetInterface (); - rtentry->SetOutputDevice (ipv4->GetNetDevice (interfaceIdx)); + rtentry->SetOutputDevice (m_ipv4->GetNetDevice (interfaceIdx)); return rtentry; } return 0; @@ -307,7 +304,6 @@ interface == route->GetInputInterface ()) { NS_LOG_LOGIC ("Found multicast route" << *i); - Ptr ipv4 = m_node->GetObject (); mrtentry = Create (); mrtentry->SetGroup (route->GetGroup ()); mrtentry->SetOrigin (route->GetOrigin ()); @@ -480,13 +476,12 @@ LocalDeliverCallback lcb, ErrorCallback ecb) { NS_LOG_FUNCTION (this << p << ipHeader << ipHeader.GetSource () << ipHeader.GetDestination () << idev); - Ptr ipv4 = m_node->GetObject (); if (ipHeader.GetDestination ().IsMulticast ()) { NS_LOG_LOGIC ("Multicast destination"); Ptr mrtentry = LookupStatic(ipHeader.GetSource (), - ipHeader.GetDestination (), ipv4->GetInterfaceForDevice (idev)); + ipHeader.GetDestination (), m_ipv4->GetInterfaceForDevice (idev)); if (mrtentry) { @@ -550,22 +545,100 @@ { delete (*i); } + m_ipv4 = 0; Ipv4RoutingProtocol::DoDispose (); } -void -Ipv4StaticRoutingImpl::SetNode (Ptr node) +void +Ipv4StaticRoutingImpl::NotifyInterfaceUp (uint32_t i) { - NS_LOG_FUNCTION_NOARGS (); - m_node = node; + // If interface address and network mask have been set, add a route + // to the network of the interface (like e.g. ifconfig does on a + // Linux box) + for (uint32_t j = 0; j < m_ipv4->GetNAddresses (i); j++) + { + if (m_ipv4->GetAddress (i,j).GetLocal () != Ipv4Address () && + m_ipv4->GetAddress (i,j).GetMask () != Ipv4Mask ()) + { + AddNetworkRouteTo (m_ipv4->GetAddress (i,j).GetLocal ().CombineMask (m_ipv4->GetAddress (i,j).GetMask ()), + m_ipv4->GetAddress (i,j).GetMask (), i); + } + } +} + +void +Ipv4StaticRoutingImpl::NotifyInterfaceDown (uint32_t i) +{ + // Remove all static routes that are going through this interface + for (uint32_t j = 0; j < GetNRoutes (); j++) + { + Ipv4RoutingTableEntry route = GetRoute (j); + if (route.GetInterface () == i) + { + RemoveRoute (j); + } + } } -Ptr -Ipv4StaticRoutingImpl::GetNode (void) const +void +Ipv4StaticRoutingImpl::NotifyAddAddress (uint32_t interface, Ipv4InterfaceAddress address) +{ + NS_LOG_FUNCTION (this << interface); + if (!m_ipv4->IsUp (interface)) + { + return; + } + + Ipv4Address networkAddress = address.GetLocal ().CombineMask (address.GetMask ()); + Ipv4Mask networkMask = address.GetMask (); + if (address.GetLocal () != Ipv4Address () && + address.GetMask () != Ipv4Mask ()) + { + AddNetworkRouteTo (networkAddress, + networkMask, interface); + } +} +void +Ipv4StaticRoutingImpl::NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress address) { - NS_LOG_FUNCTION_NOARGS (); - return m_node; -} + if (!m_ipv4->IsUp (interface)) + { + return; + } + Ipv4Address networkAddress = address.GetLocal ().CombineMask (address.GetMask ()); + Ipv4Mask networkMask = address.GetMask (); + // Remove all static routes that are going through this interface + // which reference this network + for (uint32_t j = 0; j < GetNRoutes (); j++) + { + Ipv4RoutingTableEntry route = GetRoute (j); + if (route.GetInterface () == interface && + route.IsNetwork () && + route.GetDestNetwork () == networkAddress && + route.GetDestNetworkMask () == networkMask) + { + RemoveRoute (j); + } + } +} +void +Ipv4StaticRoutingImpl::SetIpv4 (Ptr ipv4) +{ + NS_LOG_FUNCTION (this << ipv4); + NS_ASSERT (m_ipv4 == 0 && ipv4 != 0); + m_ipv4 = ipv4; + for (uint32_t i = 0; i < m_ipv4->GetNInterfaces (); i++) + { + if (m_ipv4->IsUp (i)) + { + NotifyInterfaceUp (i); + } + else + { + NotifyInterfaceDown (i); + } + } +} }//namespace ns3 diff -r 51fb48b38c2f -r 2f106fd728ab src/internet-stack/ipv4-static-routing-impl.h --- a/src/internet-stack/ipv4-static-routing-impl.h Fri Jun 19 09:17:08 2009 +0200 +++ b/src/internet-stack/ipv4-static-routing-impl.h Fri Jun 12 13:44:19 2009 -0700 @@ -56,6 +56,13 @@ UnicastForwardCallback ucb, MulticastForwardCallback mcb, LocalDeliverCallback lcb, ErrorCallback ecb); + virtual void NotifyInterfaceUp (uint32_t interface); + virtual void NotifyInterfaceDown (uint32_t interface); + virtual void NotifyAddAddress (uint32_t interface, Ipv4InterfaceAddress address); + virtual void NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress address); + virtual void SetIpv4 (Ptr ipv4); + + /** * \brief Add a host route to the static routing table. * @@ -332,11 +339,8 @@ */ void RemoveMulticastRoute (uint32_t index); - void SetNode (Ptr node); - Ptr GetNode (void) const; - protected: - void DoDispose (void); + virtual void DoDispose (void); private: typedef std::list HostRoutes; @@ -359,7 +363,7 @@ Ipv4RoutingTableEntry *m_defaultRoute; MulticastRoutes m_multicastRoutes; - Ptr m_node; + Ptr m_ipv4; }; } // Namespace ns3 diff -r 51fb48b38c2f -r 2f106fd728ab src/internet-stack/tcp-socket-impl.cc --- a/src/internet-stack/tcp-socket-impl.cc Fri Jun 19 09:17:08 2009 +0200 +++ b/src/internet-stack/tcp-socket-impl.cc Fri Jun 12 13:44:19 2009 -0700 @@ -25,15 +25,16 @@ #include "ns3/ipv4.h" #include "ns3/ipv4-interface-address.h" #include "ns3/ipv4-route.h" -#include "tcp-socket-impl.h" -#include "tcp-l4-protocol.h" -#include "ipv4-end-point.h" +#include "ns3/ipv4-routing-protocol.h" #include "ns3/simulation-singleton.h" -#include "tcp-typedefs.h" #include "ns3/simulator.h" #include "ns3/packet.h" #include "ns3/uinteger.h" #include "ns3/trace-source-accessor.h" +#include "tcp-typedefs.h" +#include "tcp-socket-impl.h" +#include "tcp-l4-protocol.h" +#include "ipv4-end-point.h" #include diff -r 51fb48b38c2f -r 2f106fd728ab src/internet-stack/tcp-test.cc --- a/src/internet-stack/tcp-test.cc Fri Jun 19 09:17:08 2009 +0200 +++ b/src/internet-stack/tcp-test.cc Fri Jun 12 13:44:19 2009 -0700 @@ -59,9 +59,7 @@ //Routing for Ipv4 Ptr ipv4RoutingImpl = CreateObject (); ipv4->SetRoutingProtocol (ipv4RoutingImpl); - ipv4RoutingImpl->SetNode (node); Ptr ipv4staticRoutingImpl = CreateObject (); - ipv4staticRoutingImpl->SetNode (node); ipv4RoutingImpl->AddRoutingProtocol (ipv4staticRoutingImpl, 0); node->AggregateObject(ipv4); //ICMP diff -r 51fb48b38c2f -r 2f106fd728ab src/internet-stack/udp-test.cc --- a/src/internet-stack/udp-test.cc Fri Jun 19 09:17:08 2009 +0200 +++ b/src/internet-stack/udp-test.cc Fri Jun 12 13:44:19 2009 -0700 @@ -59,9 +59,7 @@ //Routing for Ipv4 Ptr ipv4RoutingImpl = CreateObject (); ipv4->SetRoutingProtocol (ipv4RoutingImpl); - ipv4RoutingImpl->SetNode (node); Ptr ipv4staticRoutingImpl = CreateObject (); - ipv4staticRoutingImpl->SetNode (node); ipv4RoutingImpl->AddRoutingProtocol (ipv4staticRoutingImpl, 0); node->AggregateObject(ipv4); //ICMP diff -r 51fb48b38c2f -r 2f106fd728ab src/node/ipv4-routing-protocol.h --- a/src/node/ipv4-routing-protocol.h Fri Jun 19 09:17:08 2009 +0200 +++ b/src/node/ipv4-routing-protocol.h Fri Jun 12 13:44:19 2009 -0700 @@ -23,6 +23,8 @@ #include "ns3/object.h" #include "ns3/socket.h" #include "ipv4-header.h" +#include "ipv4-interface-address.h" +#include "ipv4.h" namespace ns3 { @@ -91,6 +93,48 @@ virtual bool RouteInput (Ptr p, const Ipv4Header &header, Ptr idev, UnicastForwardCallback ucb, MulticastForwardCallback mcb, LocalDeliverCallback lcb, ErrorCallback ecb) = 0; + + /** + * \param interface the index of the interface we are being notified about + * + * Protocols are expected to implement this method to be notified of the state change of + * an interface in a node. + */ + virtual void NotifyInterfaceUp (uint32_t interface) = 0; + /** + * \param interface the index of the interface we are being notified about + * + * Protocols are expected to implement this method to be notified of the state change of + * an interface in a node. + */ + virtual void NotifyInterfaceDown (uint32_t interface) = 0; + + /** + * \param interface the index of the interface we are being notified about + * \param address a new address being added to an interface + * + * Protocols are expected to implement this method to be notified whenever + * a new address is added to an interface. Typically used to add a 'network route' on an + * interface. Can be invoked on an up or down interface. + */ + virtual void NotifyAddAddress (uint32_t interface, Ipv4InterfaceAddress address) = 0; + + /** + * \param interface the index of the interface we are being notified about + * \param address a new address being added to an interface + * + * Protocols are expected to implement this method to be notified whenever + * a new address is removed from an interface. Typically used to remove the 'network route' of an + * interface. Can be invoked on an up or down interface. + */ + virtual void NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress address) = 0; + + /** + * \param ipv4 the ipv4 object this routing protocol is being associated with + * + * Typically, invoked directly or indirectly from ns3::Ipv4::SetRoutingProtocol + */ + virtual void SetIpv4 (Ptr ipv4) = 0; }; } //namespace ns3 diff -r 51fb48b38c2f -r 2f106fd728ab src/node/ipv4-static-routing.h --- a/src/node/ipv4-static-routing.h Fri Jun 19 09:17:08 2009 +0200 +++ b/src/node/ipv4-static-routing.h Fri Jun 12 13:44:19 2009 -0700 @@ -357,10 +357,6 @@ * \see Ipv4StaticRouting::AddRoute */ virtual void RemoveMulticastRoute (uint32_t index) = 0; - - virtual void SetNode (Ptr node) = 0; - virtual Ptr GetNode (void) const = 0; - }; } // Namespace ns3 diff -r 51fb48b38c2f -r 2f106fd728ab src/node/ipv4.h --- a/src/node/ipv4.h Fri Jun 19 09:17:08 2009 +0200 +++ b/src/node/ipv4.h Fri Jun 12 13:44:19 2009 -0700 @@ -24,7 +24,6 @@ #include "ns3/object.h" #include "ns3/socket.h" #include "ns3/callback.h" -#include "ipv4-routing-protocol.h" #include "ipv4-address.h" #include "ipv4-interface-address.h" @@ -33,6 +32,7 @@ class Node; class NetDevice; class Packet; +class Ipv4RoutingProtocol; /** * \ingroup node diff -r 51fb48b38c2f -r 2f106fd728ab src/routing/global-routing/global-route-manager-impl.cc --- a/src/routing/global-routing/global-route-manager-impl.cc Fri Jun 19 09:17:08 2009 +0200 +++ b/src/routing/global-routing/global-route-manager-impl.cc Fri Jun 12 13:44:19 2009 -0700 @@ -416,7 +416,6 @@ NS_LOG_LOGIC ("Adding GlobalRouting Protocol to node " << node->GetId ()); Ptr globalRouting = CreateObject (); - globalRouting->SetNode (node); // Here, we check whether there is an existing Ipv4RoutingProtocol object // to add this protocol to. Ptr ipv4 = node->GetObject (); diff -r 51fb48b38c2f -r 2f106fd728ab src/routing/global-routing/ipv4-global-routing.cc --- a/src/routing/global-routing/ipv4-global-routing.cc Fri Jun 19 09:17:08 2009 +0200 +++ b/src/routing/global-routing/ipv4-global-routing.cc Fri Jun 12 13:44:19 2009 -0700 @@ -139,14 +139,13 @@ } if (found == true) { - Ptr ipv4 = m_node->GetObject (); rtentry = Create (); rtentry->SetDestination (route->GetDest ()); // XXX handle multi-address case - rtentry->SetSource (ipv4->GetAddress (route->GetInterface(), 0).GetLocal ()); + rtentry->SetSource (m_ipv4->GetAddress (route->GetInterface(), 0).GetLocal ()); rtentry->SetGateway (route->GetGateway ()); uint32_t interfaceIdx = route->GetInterface (); - rtentry->SetOutputDevice (ipv4->GetNetDevice (interfaceIdx)); + rtentry->SetOutputDevice (m_ipv4->GetNetDevice (interfaceIdx)); return rtentry; } else @@ -318,21 +317,25 @@ // route request. } } - -void -Ipv4GlobalRouting::SetNode (Ptr node) +void +Ipv4GlobalRouting::NotifyInterfaceUp (uint32_t i) +{} +void +Ipv4GlobalRouting::NotifyInterfaceDown (uint32_t i) +{} +void +Ipv4GlobalRouting::NotifyAddAddress (uint32_t interface, Ipv4InterfaceAddress address) +{} +void +Ipv4GlobalRouting::NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress address) +{} +void +Ipv4GlobalRouting::SetIpv4 (Ptr ipv4) { - NS_LOG_FUNCTION_NOARGS (); - m_node = node; -} - -Ptr -Ipv4GlobalRouting::GetNode (void) const -{ - NS_LOG_FUNCTION_NOARGS (); - return m_node; + NS_LOG_FUNCTION(this << ipv4); + NS_ASSERT (m_ipv4 == 0 && ipv4 != 0); + m_ipv4 = ipv4; } - }//namespace ns3 diff -r 51fb48b38c2f -r 2f106fd728ab src/routing/global-routing/ipv4-global-routing.h --- a/src/routing/global-routing/ipv4-global-routing.h Fri Jun 19 09:17:08 2009 +0200 +++ b/src/routing/global-routing/ipv4-global-routing.h Fri Jun 12 13:44:19 2009 -0700 @@ -85,6 +85,11 @@ virtual bool RouteInput (Ptr p, const Ipv4Header &header, Ptr idev, UnicastForwardCallback ucb, MulticastForwardCallback mcb, LocalDeliverCallback lcb, ErrorCallback ecb); + virtual void NotifyInterfaceUp (uint32_t interface); + virtual void NotifyInterfaceDown (uint32_t interface); + virtual void NotifyAddAddress (uint32_t interface, Ipv4InterfaceAddress address); + virtual void NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress address); + virtual void SetIpv4 (Ptr ipv4); /** * \brief Add a host route to the global routing table. @@ -189,9 +194,6 @@ */ void RemoveRoute (uint32_t i); - void SetNode (Ptr node); - Ptr GetNode (void) const; - protected: void DoDispose (void); @@ -208,7 +210,7 @@ HostRoutes m_hostRoutes; NetworkRoutes m_networkRoutes; - Ptr m_node; + Ptr m_ipv4; }; } // Namespace ns3 diff -r 51fb48b38c2f -r 2f106fd728ab src/routing/olsr/olsr-routing-protocol.cc --- a/src/routing/olsr/olsr-routing-protocol.cc Fri Jun 19 09:17:08 2009 +0200 +++ b/src/routing/olsr/olsr-routing-protocol.cc Fri Jun 12 13:44:19 2009 -0700 @@ -185,19 +185,21 @@ RoutingProtocol::RoutingProtocol () - : - m_helloTimer (Timer::CANCEL_ON_DESTROY), - m_tcTimer (Timer::CANCEL_ON_DESTROY), - m_midTimer (Timer::CANCEL_ON_DESTROY), - m_queuedMessagesTimer (Timer::CANCEL_ON_DESTROY) + : m_ipv4 (0), + m_helloTimer (Timer::CANCEL_ON_DESTROY), + m_tcTimer (Timer::CANCEL_ON_DESTROY), + m_midTimer (Timer::CANCEL_ON_DESTROY), + m_queuedMessagesTimer (Timer::CANCEL_ON_DESTROY) {} RoutingProtocol::~RoutingProtocol () {} void -RoutingProtocol::SetNode (Ptr node) +RoutingProtocol::SetIpv4 (Ptr ipv4) { + NS_ASSERT (ipv4 != 0); + NS_ASSERT (m_ipv4 == 0); NS_LOG_DEBUG ("Created olsr::RoutingProtocol"); m_helloTimer.SetFunction (&RoutingProtocol::HelloTimerExpire, this); m_tcTimer.SetFunction (&RoutingProtocol::TcTimerExpire, this); @@ -210,8 +212,7 @@ m_linkTupleTimerFirstTime = true; - m_ipv4 = node->GetObject (); - NS_ASSERT (m_ipv4); + m_ipv4 = ipv4; } void RoutingProtocol::DoDispose () @@ -2651,6 +2652,18 @@ return false; } } +void +RoutingProtocol::NotifyInterfaceUp (uint32_t i) +{} +void +RoutingProtocol::NotifyInterfaceDown (uint32_t i) +{} +void +RoutingProtocol::NotifyAddAddress (uint32_t interface, Ipv4InterfaceAddress address) +{} +void +RoutingProtocol::NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress address) +{} /// diff -r 51fb48b38c2f -r 2f106fd728ab src/routing/olsr/olsr-routing-protocol.h --- a/src/routing/olsr/olsr-routing-protocol.h Fri Jun 19 09:17:08 2009 +0200 +++ b/src/routing/olsr/olsr-routing-protocol.h Fri Jun 12 13:44:19 2009 -0700 @@ -36,6 +36,7 @@ #include "ns3/timer.h" #include "ns3/traced-callback.h" #include "ns3/ipv4.h" +#include "ns3/ipv4-routing-protocol.h" #include #include @@ -67,8 +68,6 @@ RoutingProtocol (); virtual ~RoutingProtocol (); - void SetNode (Ptr node); - void Start (); void SetMainInterface (uint32_t interface); @@ -125,6 +124,12 @@ virtual bool RouteInput (Ptr p, const Ipv4Header &header, Ptr idev, UnicastForwardCallback ucb, MulticastForwardCallback mcb, LocalDeliverCallback lcb, ErrorCallback ecb); + virtual void NotifyInterfaceUp (uint32_t interface); + virtual void NotifyInterfaceDown (uint32_t interface); + virtual void NotifyAddAddress (uint32_t interface, Ipv4InterfaceAddress address); + virtual void NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress address); + virtual void SetIpv4 (Ptr ipv4); + void DoDispose ();