From bfec349d778977341c5f321afdafe9068433f2ca Mon Sep 17 00:00:00 2001 From: Borovkova Elena Date: Thu, 30 Jul 2009 11:14:47 +0400 Subject: [PATCH] RecvReply changed to respond properly to receive RREP with origin address != receiver address, but == local address of another interface --- src/internet-stack/ipv4-interface.cc | 18 +++++++------- src/internet-stack/ipv4-l3-protocol.cc | 5 ++-- src/internet-stack/raw-socket-impl.cc | 29 ++++++++++------------- src/node/socket.cc | 1 - src/routing/aodv/aodv-routing-protocol.cc | 8 ++++--- src/routing/aodv/aodv-rtable.cc | 1 - 6 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/internet-stack/ipv4-interface.cc b/src/internet-stack/ipv4-interface.cc index c54155152..15b957611 100644 --- a/src/internet-stack/ipv4-interface.cc +++ b/src/internet-stack/ipv4-interface.cc @@ -178,7 +178,7 @@ Ipv4Interface::SetForwarding (bool val) void Ipv4Interface::Send (Ptr p, Ipv4Address dest) { - NS_LOG_FUNCTION (dest << *p); + NS_LOG_UNCOND (dest << *p); if (!IsUp()) { return; @@ -188,6 +188,7 @@ Ipv4Interface::Send (Ptr p, Ipv4Address dest) { // XXX additional checks needed here (such as whether multicast // goes to loopback)? + NS_LOG_UNCOND ("Ipv4Interface::Send loopback"); m_device->Send (p, m_device->GetBroadcast (), Ipv4L3Protocol::PROT_NUMBER); return; @@ -197,6 +198,7 @@ Ipv4Interface::Send (Ptr p, Ipv4Address dest) { if (dest == (*i).GetLocal ()) { + NS_LOG_UNCOND ("to local"); Ptr ipv4 = m_node->GetObject (); ipv4->Receive (m_device, p, Ipv4L3Protocol::PROT_NUMBER, @@ -209,19 +211,19 @@ Ipv4Interface::Send (Ptr p, Ipv4Address dest) } if (m_device->NeedsArp ()) { - NS_LOG_LOGIC ("Needs ARP" << " " << dest); + NS_LOG_UNCOND ("Needs ARP" << " " << dest); Ptr arp = m_node->GetObject (); Address hardwareDestination; bool found = false; if (dest.IsBroadcast ()) { - NS_LOG_LOGIC ("All-network Broadcast"); + NS_LOG_UNCOND ("All-network Broadcast"); hardwareDestination = m_device->GetBroadcast (); found = true; } else if (dest.IsMulticast ()) { - NS_LOG_LOGIC ("IsMulticast"); + NS_LOG_UNCOND ("IsMulticast"); NS_ASSERT_MSG(m_device->IsMulticast (), "ArpIpv4Interface::SendTo (): Sending multicast packet over " "non-multicast device"); @@ -235,7 +237,7 @@ Ipv4Interface::Send (Ptr p, Ipv4Address dest) { if (dest.IsSubnetDirectedBroadcast ((*i).GetMask ())) { - NS_LOG_LOGIC ("Subnetwork Broadcast"); + NS_LOG_UNCOND ("Subnetwork Broadcast hardwareDestination " << hardwareDestination); hardwareDestination = m_device->GetBroadcast (); found = true; break; @@ -243,21 +245,21 @@ Ipv4Interface::Send (Ptr p, Ipv4Address dest) } if (!found) { - NS_LOG_LOGIC ("ARP Lookup"); + NS_LOG_UNCOND ("ARP Lookup"); found = arp->Lookup (p, dest, m_device, m_cache, &hardwareDestination); } } if (found) { - NS_LOG_LOGIC ("Address Resolved. Send."); + NS_LOG_UNCOND ("Address Resolved. Send."); m_device ->Send (p, hardwareDestination, Ipv4L3Protocol::PROT_NUMBER); } } else { - NS_LOG_LOGIC ("Doesn't need ARP"); + NS_LOG_UNCOND ("Doesn't need ARP"); m_device->Send (p, m_device->GetBroadcast (), Ipv4L3Protocol::PROT_NUMBER); } diff --git a/src/internet-stack/ipv4-l3-protocol.cc b/src/internet-stack/ipv4-l3-protocol.cc index 88ab3cc97..e521be431 100644 --- a/src/internet-stack/ipv4-l3-protocol.cc +++ b/src/internet-stack/ipv4-l3-protocol.cc @@ -390,9 +390,9 @@ void Ipv4L3Protocol::Receive( Ptr device, Ptr p, uint16_t protocol, const Address &from, const Address &to, NetDevice::PacketType packetType) { - NS_LOG_FUNCTION (this << &device << p << protocol << from); + NS_LOG_UNCOND ("Ipv4L3Protocol::Receive" << &device << p << protocol << from); - NS_LOG_LOGIC ("Packet from " << from << " received on node " << + NS_LOG_UNCOND ("Packet from " << from << " received on node " << m_node->GetId ()); uint32_t interface = 0; @@ -430,6 +430,7 @@ Ipv4L3Protocol::Receive( Ptr device, Ptr p, uint16_t pr if (!ipHeader.IsChecksumOk ()) { + NS_LOG_UNCOND("bad check sum"); m_dropTrace (packet); return; } diff --git a/src/internet-stack/raw-socket-impl.cc b/src/internet-stack/raw-socket-impl.cc index 8d9c4870d..089909f04 100644 --- a/src/internet-stack/raw-socket-impl.cc +++ b/src/internet-stack/raw-socket-impl.cc @@ -194,14 +194,15 @@ RawSocketImpl::SendTo (Ptr packet, uint32_t flags, const Address &toAddr } void -RawSocketImpl::SendByInterface (Ptr packet, Ptr route) +RawSocketImpl::SendByInterface (Ptr p, Ptr route) { NS_ASSERT(m_node != 0); Ipv4Header ipv4Header; + Ptr packet = p->Copy(); packet->PeekHeader(ipv4Header); Ipv4Address source = ipv4Header.GetSource (); Ipv4Address destination = ipv4Header.GetDestination (); - NS_LOG_UNCOND ("RawSocketImpl::SendByInterface to " << destination); + NS_LOG_UNCOND ("RawSocketImpl::SendByInterface to " << destination << " from " << source); // Handle a few cases: // 1) packet is destined to limited broadcast address @@ -224,8 +225,9 @@ RawSocketImpl::SendByInterface (Ptr packet, Ptr route) } // 2) check: packet is destined to a subnet-directed broadcast address - uint32_t ifaceIndex = 0; bool result = false; + uint32_t ifaceIndex = 0; + NS_LOG_UNCOND("number of interfaces " << m_interfaces.size ()); for (std::list< Ptr >::iterator ifaceIter = m_interfaces.begin (); ifaceIter != m_interfaces.end (); ifaceIter++, ifaceIndex++) { Ptr outInterface = *ifaceIter; @@ -234,19 +236,14 @@ RawSocketImpl::SendByInterface (Ptr packet, Ptr route) Ipv4InterfaceAddress ifAddr = m_ipv4->GetAddress (ifaceIndex, j); NS_LOG_UNCOND ("Testing address " << ifAddr.GetLocal () << " with mask " << ifAddr.GetMask ()); if (destination.IsSubnetDirectedBroadcast (ifAddr.GetMask ()) && - destination.CombineMask (ifAddr.GetMask ()) == ifAddr.GetLocal ().CombineMask (ifAddr.GetMask ()) ) - { - NS_LOG_UNCOND ("RawSocketImpl::Send case 2: subnet directed bcast to " << ifAddr.GetLocal ()); - if (ifAddr.GetLocal() != loopback) + (destination.CombineMask (ifAddr.GetMask ()) == ifAddr.GetLocal ().CombineMask (ifAddr.GetMask ())) ) + if ( (ifAddr.GetLocal() != loopback)/* && (ifAddr.GetLocal() != source)*/) { - Ptr copy = packet->Copy(); - copy->RemoveHeader(ipv4Header); - ipv4Header.SetSource(ifAddr.GetLocal()); - copy->AddHeader(ipv4Header); - outInterface->Send (copy, destination); + NS_LOG_UNCOND ("Send case 2: subnet directed bcast to " << ifAddr.GetLocal ()); + Ptr packetCopy = packet->Copy (); + outInterface->Send (packetCopy, destination); result = true; } - } } } if(result) return; @@ -268,7 +265,7 @@ RawSocketImpl::SendByInterface (Ptr packet, Ptr route) if (outInterface->IsUp ()) { NS_LOG_UNCOND ("Send to gateway " << route->GetGateway ()); - outInterface->Send (packet, route->GetGateway ()); + outInterface->Send (p, route->GetGateway ()); } else { @@ -304,14 +301,14 @@ RawSocketImpl::GetRxAvailable (void) const Ptr RawSocketImpl::Recv (uint32_t maxSize, uint32_t flags) { - NS_LOG_FUNCTION (this << maxSize << flags); + NS_LOG_UNCOND ("RawSocketImpl::Recv" << maxSize << flags); Address tmp; return RecvFrom (maxSize, flags, tmp); } Ptr RawSocketImpl::RecvFrom (uint32_t maxSize, uint32_t flags, Address &fromAddress) { - NS_LOG_FUNCTION (this << " maxSize " << maxSize << " flags " << flags << " address " < Socket::CreateSocket (Ptr node, TypeId tid) { Ptr s; - NS_LOG_UNCOND(tid); NS_ASSERT(node != 0); Ptr socketFactory = node->GetObject (tid); NS_ASSERT(socketFactory != 0); diff --git a/src/routing/aodv/aodv-routing-protocol.cc b/src/routing/aodv/aodv-routing-protocol.cc index 1783f72a2..551efb288 100644 --- a/src/routing/aodv/aodv-routing-protocol.cc +++ b/src/routing/aodv/aodv-routing-protocol.cc @@ -764,7 +764,7 @@ RoutingProtocol::SendReply (RreqHeader const & rreqHeader, RoutingTableEntry con TypeHeader tHeader (AODVTYPE_RREP); packet->AddHeader (tHeader); BuildPacket (/*packet*/packet, /*source port*/AODV_PORT, /*destination port*/AODV_PORT, /*source address*/toOrigin.GetInterface ().GetLocal(), - /*destination address*/toOrigin.GetNextHop(), /*id*/0 , /*TTL*/ toOrigin.GetHop()); //TODO TTL + /*destination address*/toOrigin.GetNextHop(), /*id*/0 , /*TTL*/ /*toOrigin.GetHop()*/ 35); //TODO TTL Ptr socket = FindSocketWithInterfaceAddress(toOrigin.GetInterface ().GetLocal ()); socket->SendTo (packet, 0, InetSocketAddress (toOrigin.GetNextHop(), AODV_PORT)); } @@ -818,7 +818,7 @@ RoutingProtocol::SendReplyAck(Ipv4Address neighbor) RoutingTableEntry toNeighbor; m_routingTable.LookupRoute(neighbor, toNeighbor); BuildPacket (/*packet*/packet, /*source port*/AODV_PORT, /*destination port*/AODV_PORT, /*source address*/toNeighbor.GetInterface ().GetLocal (), - /*destination address*/neighbor, /*id*/0 , /*TTL*/ 1); + /*destination address*/neighbor, /*id*/0 , /*TTL*/ 35); // TODO TTL Ptr socket = FindSocketWithInterfaceAddress(toNeighbor.GetInterface ().GetLocal ()); socket->SendTo (packet, 0, InetSocketAddress (neighbor, AODV_PORT)); } @@ -893,7 +893,8 @@ RoutingProtocol::RecvReply (Ptr p, Ipv4Address receiver, Ipv4Address sen } // Acknowledge receipt of the RREP by sending a RREP-ACK message back if(rrepHeader.GetAckRequired()) SendReplyAck(sender); - if (receiver == rrepHeader.GetOrigin ()) + NS_LOG_LOGIC ("receiver " << receiver << " origin " << rrepHeader.GetOrigin ()); + if ( FindSocketWithInterfaceAddress (rrepHeader.GetOrigin ()) != 0 ) { if (toDst.GetFlag () == RTF_IN_SEARCH) m_routingTable.Update (rrepHeader.GetDst (), newEntry); @@ -1132,6 +1133,7 @@ RoutingProtocol::SendHello () void RoutingProtocol::SendPacketFromQueue (Ipv4Address dst, Ptr route) { + NS_LOG_FUNCTION(this); QueueEntry queueEntry; while (m_queue.Dequeue (dst, queueEntry)) { diff --git a/src/routing/aodv/aodv-rtable.cc b/src/routing/aodv/aodv-rtable.cc index e4359860b..6311564f5 100644 --- a/src/routing/aodv/aodv-rtable.cc +++ b/src/routing/aodv/aodv-rtable.cc @@ -249,7 +249,6 @@ RoutingTable::MarkLinkAsUinidirectional (Ipv4Address neighbor, Time blacklistTim return true; } - void RoutingTable::Print(std::ostream &os) const {