|
|
| 47 |
#include "ns3/enum.h" |
47 |
#include "ns3/enum.h" |
| 48 |
#include "ns3/trace-source-accessor.h" |
48 |
#include "ns3/trace-source-accessor.h" |
| 49 |
#include "ns3/ipv4-header.h" |
49 |
#include "ns3/ipv4-header.h" |
|
|
50 |
#include "ns3/ipv4-packet-info-tag.h" |
| 50 |
|
51 |
|
| 51 |
/********** Useful macros **********/ |
52 |
/********** Useful macros **********/ |
| 52 |
|
53 |
|
|
|
| 240 |
m_hnaRoutingTable = 0; |
241 |
m_hnaRoutingTable = 0; |
| 241 |
m_routingTableAssociation = 0; |
242 |
m_routingTableAssociation = 0; |
| 242 |
|
243 |
|
| 243 |
for (std::map< Ptr<Socket>, Ipv4InterfaceAddress >::iterator iter = m_socketAddresses.begin (); |
244 |
if (m_recvSocket) |
| 244 |
iter != m_socketAddresses.end (); iter++) |
245 |
{ |
|
|
246 |
m_recvSocket->Close (); |
| 247 |
} |
| 248 |
|
| 249 |
for (std::map< Ptr<Socket>, Ipv4InterfaceAddress >::iterator iter = m_sendSockets.begin (); |
| 250 |
iter != m_sendSockets.end (); iter++) |
| 245 |
{ |
251 |
{ |
| 246 |
iter->first->Close (); |
252 |
iter->first->Close (); |
| 247 |
} |
253 |
} |
| 248 |
m_socketAddresses.clear (); |
254 |
m_sendSockets.clear (); |
| 249 |
|
255 |
|
| 250 |
Ipv4RoutingProtocol::DoDispose (); |
256 |
Ipv4RoutingProtocol::DoDispose (); |
| 251 |
} |
257 |
} |
|
|
| 340 |
continue; |
346 |
continue; |
| 341 |
} |
347 |
} |
| 342 |
|
348 |
|
| 343 |
// Create a socket to listen only on this interface |
349 |
// Create a socket to listen on all the interfaces |
|
|
350 |
if (m_recvSocket == 0) |
| 351 |
{ |
| 352 |
m_recvSocket = Socket::CreateSocket (GetObject<Node> (), |
| 353 |
UdpSocketFactory::GetTypeId ()); |
| 354 |
m_recvSocket->SetAllowBroadcast (true); |
| 355 |
InetSocketAddress inetAddr (Ipv4Address::GetAny (), OLSR_PORT_NUMBER); |
| 356 |
m_recvSocket->SetRecvCallback (MakeCallback (&RoutingProtocol::RecvOlsr, this)); |
| 357 |
if (m_recvSocket->Bind (inetAddr)) |
| 358 |
{ |
| 359 |
NS_FATAL_ERROR ("Failed to bind() OLSR socket"); |
| 360 |
} |
| 361 |
m_recvSocket->SetRecvPktInfo (true); |
| 362 |
m_recvSocket->ShutdownSend (); |
| 363 |
} |
| 364 |
|
| 365 |
// Create a socket to send packets from this specific interfaces |
| 344 |
Ptr<Socket> socket = Socket::CreateSocket (GetObject<Node> (), |
366 |
Ptr<Socket> socket = Socket::CreateSocket (GetObject<Node> (), |
| 345 |
UdpSocketFactory::GetTypeId ()); |
367 |
UdpSocketFactory::GetTypeId ()); |
| 346 |
socket->SetAllowBroadcast (true); |
368 |
socket->SetAllowBroadcast (true); |
|
|
| 351 |
NS_FATAL_ERROR ("Failed to bind() OLSR socket"); |
373 |
NS_FATAL_ERROR ("Failed to bind() OLSR socket"); |
| 352 |
} |
374 |
} |
| 353 |
socket->BindToNetDevice (m_ipv4->GetNetDevice (i)); |
375 |
socket->BindToNetDevice (m_ipv4->GetNetDevice (i)); |
| 354 |
m_socketAddresses[socket] = m_ipv4->GetAddress (i, 0); |
376 |
socket->SetRecvPktInfo (true); |
|
|
377 |
m_sendSockets[socket] = m_ipv4->GetAddress (i, 0); |
| 355 |
|
378 |
|
| 356 |
canRunOlsr = true; |
379 |
canRunOlsr = true; |
| 357 |
} |
380 |
} |
|
|
| 386 |
Address sourceAddress; |
409 |
Address sourceAddress; |
| 387 |
receivedPacket = socket->RecvFrom (sourceAddress); |
410 |
receivedPacket = socket->RecvFrom (sourceAddress); |
| 388 |
|
411 |
|
|
|
412 |
Ipv4PacketInfoTag interfaceInfo; |
| 413 |
if (!receivedPacket->RemovePacketTag (interfaceInfo)) |
| 414 |
{ |
| 415 |
NS_ABORT_MSG ("No incoming interface on OLSR message, aborting."); |
| 416 |
} |
| 417 |
uint32_t incomingIf = interfaceInfo.GetRecvIf (); |
| 418 |
Ptr<Node> node = this->GetObject<Node> (); |
| 419 |
Ptr<NetDevice> dev = node->GetDevice (incomingIf); |
| 420 |
uint32_t recvInterfaceIndex = m_ipv4->GetInterfaceForDevice (dev); |
| 421 |
|
| 422 |
if (m_interfaceExclusions.find (recvInterfaceIndex) != m_interfaceExclusions.end ()) |
| 423 |
{ |
| 424 |
return; |
| 425 |
} |
| 426 |
|
| 427 |
|
| 389 |
InetSocketAddress inetSourceAddr = InetSocketAddress::ConvertFrom (sourceAddress); |
428 |
InetSocketAddress inetSourceAddr = InetSocketAddress::ConvertFrom (sourceAddress); |
| 390 |
Ipv4Address senderIfaceAddr = inetSourceAddr.GetIpv4 (); |
429 |
Ipv4Address senderIfaceAddr = inetSourceAddr.GetIpv4 (); |
| 391 |
Ipv4Address receiverIfaceAddr = m_socketAddresses[socket].GetLocal (); |
430 |
|
|
|
431 |
int32_t interfaceForAddress = m_ipv4->GetInterfaceForAddress (senderIfaceAddr); |
| 432 |
if (interfaceForAddress != -1) |
| 433 |
{ |
| 434 |
NS_LOG_LOGIC ("Ignoring a packet sent by myself."); |
| 435 |
return; |
| 436 |
} |
| 437 |
|
| 438 |
Ipv4Address receiverIfaceAddr = m_ipv4->GetAddress (recvInterfaceIndex, 0).GetLocal (); |
| 439 |
// Ipv4Address receiverIfaceAddr = m_socketAddresses[socket].GetLocal (); |
| 392 |
NS_ASSERT (receiverIfaceAddr != Ipv4Address ()); |
440 |
NS_ASSERT (receiverIfaceAddr != Ipv4Address ()); |
| 393 |
NS_LOG_DEBUG ("OLSR node " << m_mainAddress << " received a OLSR packet from " |
441 |
NS_LOG_DEBUG ("OLSR node " << m_mainAddress << " received a OLSR packet from " |
| 394 |
<< senderIfaceAddr << " to " << receiverIfaceAddr); |
442 |
<< senderIfaceAddr << " to " << receiverIfaceAddr); |
|
|
| 1588 |
|
1636 |
|
| 1589 |
// Send it |
1637 |
// Send it |
| 1590 |
for (std::map<Ptr<Socket>, Ipv4InterfaceAddress>::const_iterator i = |
1638 |
for (std::map<Ptr<Socket>, Ipv4InterfaceAddress>::const_iterator i = |
| 1591 |
m_socketAddresses.begin (); i != m_socketAddresses.end (); i++) |
1639 |
m_sendSockets.begin (); i != m_sendSockets.end (); i++) |
| 1592 |
{ |
1640 |
{ |
|
|
1641 |
Ptr<Packet> pkt = packet->Copy (); |
| 1593 |
Ipv4Address bcast = i->second.GetLocal ().GetSubnetDirectedBroadcast (i->second.GetMask ()); |
1642 |
Ipv4Address bcast = i->second.GetLocal ().GetSubnetDirectedBroadcast (i->second.GetMask ()); |
| 1594 |
i->first->SendTo (packet, 0, InetSocketAddress (bcast, OLSR_PORT_NUMBER)); |
1643 |
i->first->SendTo (pkt, 0, InetSocketAddress (bcast, OLSR_PORT_NUMBER)); |
| 1595 |
} |
1644 |
} |
| 1596 |
} |
1645 |
} |
| 1597 |
|
1646 |
|
|
|
| 3082 |
bool |
3131 |
bool |
| 3083 |
RoutingProtocol::IsMyOwnAddress (const Ipv4Address & a) const |
3132 |
RoutingProtocol::IsMyOwnAddress (const Ipv4Address & a) const |
| 3084 |
{ |
3133 |
{ |
| 3085 |
for (std::map<Ptr<Socket>, Ipv4InterfaceAddress>::const_iterator j = |
3134 |
std::map<Ptr<Socket>, Ipv4InterfaceAddress>::const_iterator j; |
| 3086 |
m_socketAddresses.begin (); j != m_socketAddresses.end (); ++j) |
3135 |
for (j = m_sendSockets.begin (); j != m_sendSockets.end (); ++j) |
| 3087 |
{ |
3136 |
{ |
| 3088 |
Ipv4InterfaceAddress iface = j->second; |
3137 |
Ipv4InterfaceAddress iface = j->second; |
| 3089 |
if (a == iface.GetLocal ()) |
3138 |
if (a == iface.GetLocal ()) |