217 |
217 |
218 void RoutingProtocol::DoDispose () |
218 void RoutingProtocol::DoDispose () |
219 { |
219 { |
220 m_ipv4 = 0; |
220 m_ipv4 = 0; |
221 |
221 |
222 for (std::map< Ptr<Socket>, Ipv4Address >::iterator iter = m_socketAddresses.begin (); |
222 for (std::map< Ptr<Socket>, Ipv4InterfaceAddress >::iterator iter = m_socketAddresses.begin (); |
223 iter != m_socketAddresses.end (); iter++) |
223 iter != m_socketAddresses.end (); iter++) |
224 { |
224 { |
225 iter->first->Close (); |
225 iter->first->Close (); |
226 } |
226 } |
227 m_socketAddresses.clear (); |
227 m_socketAddresses.clear (); |
276 if (socket->Bind (InetSocketAddress (addr, OLSR_PORT_NUMBER))) |
276 if (socket->Bind (InetSocketAddress (addr, OLSR_PORT_NUMBER))) |
277 { |
277 { |
278 NS_FATAL_ERROR ("Failed to bind() OLSR receive socket"); |
278 NS_FATAL_ERROR ("Failed to bind() OLSR receive socket"); |
279 } |
279 } |
280 socket->Connect (InetSocketAddress (Ipv4Address (0xffffffff), OLSR_PORT_NUMBER)); |
280 socket->Connect (InetSocketAddress (Ipv4Address (0xffffffff), OLSR_PORT_NUMBER)); |
281 m_socketAddresses[socket] = addr; |
281 m_socketAddresses[socket] = m_ipv4->GetAddress (i, 0); |
282 } |
282 } |
283 |
283 |
284 HelloTimerExpire (); |
284 HelloTimerExpire (); |
285 TcTimerExpire (); |
285 TcTimerExpire (); |
286 MidTimerExpire (); |
286 MidTimerExpire (); |
303 Address sourceAddress; |
303 Address sourceAddress; |
304 receivedPacket = socket->RecvFrom (sourceAddress); |
304 receivedPacket = socket->RecvFrom (sourceAddress); |
305 |
305 |
306 InetSocketAddress inetSourceAddr = InetSocketAddress::ConvertFrom (sourceAddress); |
306 InetSocketAddress inetSourceAddr = InetSocketAddress::ConvertFrom (sourceAddress); |
307 Ipv4Address senderIfaceAddr = inetSourceAddr.GetIpv4 (); |
307 Ipv4Address senderIfaceAddr = inetSourceAddr.GetIpv4 (); |
308 Ipv4Address receiverIfaceAddr = m_socketAddresses[socket]; |
308 Ipv4Address receiverIfaceAddr = m_socketAddresses[socket].GetLocal (); |
309 NS_ASSERT (receiverIfaceAddr != Ipv4Address ()); |
309 NS_ASSERT (receiverIfaceAddr != Ipv4Address ()); |
310 NS_LOG_DEBUG ("OLSR node " << m_mainAddress << " received a OLSR packet from " |
310 NS_LOG_DEBUG ("OLSR node " << m_mainAddress << " received a OLSR packet from " |
311 << senderIfaceAddr << " to " << receiverIfaceAddr); |
311 << senderIfaceAddr << " to " << receiverIfaceAddr); |
312 |
312 |
313 // All routing messages are sent from and to port RT_PORT, |
313 // All routing messages are sent from and to port RT_PORT, |
2651 } |
2651 } |
2652 return rtentry; |
2652 return rtentry; |
2653 } |
2653 } |
2654 |
2654 |
2655 bool RoutingProtocol::RouteInput (Ptr<const Packet> p, |
2655 bool RoutingProtocol::RouteInput (Ptr<const Packet> p, |
2656 const Ipv4Header &header, Ptr<const NetDevice> idev, UnicastForwardCallback ucb, MulticastForwardCallback mcb, |
2656 const Ipv4Header &header, Ptr<const NetDevice> idev, |
|
2657 UnicastForwardCallback ucb, MulticastForwardCallback mcb, |
2657 LocalDeliverCallback lcb, ErrorCallback ecb) |
2658 LocalDeliverCallback lcb, ErrorCallback ecb) |
2658 { |
2659 { |
2659 NS_LOG_FUNCTION (this << " " << m_ipv4->GetObject<Node> ()->GetId() << " " << header.GetDestination ()); |
2660 NS_LOG_FUNCTION (this << " " << m_ipv4->GetObject<Node> ()->GetId() << " " << header.GetDestination ()); |
2660 |
2661 |
|
2662 Ipv4Address dst = header.GetDestination (); |
|
2663 Ipv4Address origin = header.GetSource (); |
|
2664 |
|
2665 // Consume self-originated packets |
|
2666 if (IsMyOwnAddress (origin) == true) |
|
2667 { |
|
2668 return true; |
|
2669 } |
|
2670 |
|
2671 // Local delivery |
|
2672 NS_ASSERT (m_ipv4->GetInterfaceForDevice (idev) >= 0); |
|
2673 uint32_t iif = m_ipv4->GetInterfaceForDevice (idev); |
|
2674 if (m_ipv4->IsDestinationAddress (dst, iif)) |
|
2675 { |
|
2676 NS_LOG_LOGIC ("Local delivery to " << dst); |
|
2677 lcb (p, header, iif); |
|
2678 return true; |
|
2679 } |
|
2680 |
|
2681 // Forwarding |
2661 Ptr<Ipv4Route> rtentry; |
2682 Ptr<Ipv4Route> rtentry; |
2662 RoutingTableEntry entry1, entry2; |
2683 RoutingTableEntry entry1, entry2; |
2663 if (Lookup (header.GetDestination (), entry1)) |
2684 if (Lookup (header.GetDestination (), entry1)) |
2664 { |
2685 { |
2665 bool foundSendEntry = FindSendEntry (entry1, entry2); |
2686 bool foundSendEntry = FindSendEntry (entry1, entry2); |
2918 : TestSuite("routing-olsr", UNIT) |
2939 : TestSuite("routing-olsr", UNIT) |
2919 { |
2940 { |
2920 AddTestCase (new OlsrMprTestCase ()); |
2941 AddTestCase (new OlsrMprTestCase ()); |
2921 } |
2942 } |
2922 |
2943 |
|
2944 bool |
|
2945 RoutingProtocol::IsMyOwnAddress (const Ipv4Address & a) const |
|
2946 { |
|
2947 for (std::map<Ptr<Socket> , Ipv4InterfaceAddress>::const_iterator j = |
|
2948 m_socketAddresses.begin (); j != m_socketAddresses.end (); ++j) |
|
2949 { |
|
2950 Ipv4InterfaceAddress iface = j->second; |
|
2951 if (a == iface.GetLocal ()) |
|
2952 { |
|
2953 return true; |
|
2954 } |
|
2955 } |
|
2956 return false; |
|
2957 } |
|
2958 |
2923 |
2959 |
2924 }} // namespace olsr, ns3 |
2960 }} // namespace olsr, ns3 |
2925 |
2961 |
2926 |
2962 |