From a7434537b2cb9ca8cdc116dfd4aa0350303476dd Mon Sep 17 00:00:00 2001 From: Borovkova Elena Date: Fri, 31 Jul 2009 10:47:26 +0400 Subject: [PATCH] sending broadcast aodv packet fixed --- src/internet-stack/raw-socket-impl.cc | 41 ++++++++++++----------- src/routing/aodv/aodv-routing-protocol.cc | 12 ++++--- 2 files changed, 29 insertions(+), 24 deletions(-) diff --git a/src/internet-stack/raw-socket-impl.cc b/src/internet-stack/raw-socket-impl.cc index 089909f04..1666f5ca7 100644 --- a/src/internet-stack/raw-socket-impl.cc +++ b/src/internet-stack/raw-socket-impl.cc @@ -174,20 +174,21 @@ RawSocketImpl::SendTo (Ptr packet, uint32_t flags, const Address &toAddr if (m_ipv4->GetRoutingProtocol ()) { Ipv4Header header; - packet->PeekHeader (header); + Ptr copy = packet->Copy(); + copy->RemoveHeader (header); NS_LOG_LOGIC ("RawSocketImpl::SendTo packet uid " << packet->GetUid() << " address " << header.GetDestination()); SocketErrno errno_ = ERROR_NOTERROR;//do not use errno as it is the standard C last error number Ptr route; uint32_t oif = 0; //specify non-zero if bound to a source address - route = m_ipv4->GetRoutingProtocol ()->RouteOutput (packet, header, oif, errno_); + route = m_ipv4->GetRoutingProtocol ()->RouteOutput (copy, header, oif, errno_); if (route != 0) { - NS_LOG_UNCOND ("Route exists"); + NS_LOG_LOGIC ("Route exists"); SendByInterface(packet, route); } else { - NS_LOG_UNCOND ("dropped because no outgoing route."); + NS_LOG_LOGIC ("dropped because no outgoing route."); } } return 0; @@ -199,10 +200,10 @@ RawSocketImpl::SendByInterface (Ptr p, Ptr route) NS_ASSERT(m_node != 0); Ipv4Header ipv4Header; Ptr packet = p->Copy(); - packet->PeekHeader(ipv4Header); + packet->RemoveHeader(ipv4Header); Ipv4Address source = ipv4Header.GetSource (); Ipv4Address destination = ipv4Header.GetDestination (); - NS_LOG_UNCOND ("RawSocketImpl::SendByInterface to " << destination << " from " << source); + NS_LOG_LOGIC ("RawSocketImpl::SendByInterface to " << destination << " from " << source); // Handle a few cases: // 1) packet is destined to limited broadcast address @@ -212,14 +213,14 @@ RawSocketImpl::SendByInterface (Ptr p, Ptr route) // 1) packet is destined to limited broadcast address if (destination.IsBroadcast ()) { - NS_LOG_UNCOND ("RawSocketImpl::Send case 1: limited broadcast"); + NS_LOG_LOGIC ("RawSocketImpl::Send case 1: limited broadcast"); for (std::list< Ptr >::iterator ifaceIter = m_interfaces.begin (); ifaceIter != m_interfaces.end (); ifaceIter++) { Ptr outInterface = *ifaceIter; - Ptr packetCopy = packet->Copy (); + Ptr packetCopy = p->Copy (); NS_ASSERT (packet->GetSize () <= outInterface->GetDevice()->GetMtu ()); - outInterface->Send (packet, destination); + outInterface->Send (packetCopy, destination); } return; } @@ -227,20 +228,20 @@ RawSocketImpl::SendByInterface (Ptr p, Ptr route) // 2) check: packet is destined to a subnet-directed broadcast address bool result = false; uint32_t ifaceIndex = 0; - NS_LOG_UNCOND("number of interfaces " << m_interfaces.size ()); + NS_LOG_LOGIC("number of interfaces " << m_interfaces.size ()); for (std::list< Ptr >::iterator ifaceIter = m_interfaces.begin (); ifaceIter != m_interfaces.end (); ifaceIter++, ifaceIndex++) { Ptr outInterface = *ifaceIter; for (uint32_t j = 0; j < m_ipv4->GetNAddresses (ifaceIndex); j++) { Ipv4InterfaceAddress ifAddr = m_ipv4->GetAddress (ifaceIndex, j); - NS_LOG_UNCOND ("Testing address " << ifAddr.GetLocal () << " with mask " << ifAddr.GetMask ()); + NS_LOG_LOGIC ("Testing address " << ifAddr.GetLocal () << " with mask " << ifAddr.GetMask ()); if (destination.IsSubnetDirectedBroadcast (ifAddr.GetMask ()) && (destination.CombineMask (ifAddr.GetMask ()) == ifAddr.GetLocal ().CombineMask (ifAddr.GetMask ())) ) - if ( (ifAddr.GetLocal() != loopback)/* && (ifAddr.GetLocal() != source)*/) + //if (ifAddr.GetLocal() == source) { - NS_LOG_UNCOND ("Send case 2: subnet directed bcast to " << ifAddr.GetLocal ()); - Ptr packetCopy = packet->Copy (); + NS_LOG_LOGIC ("Send case 2: subnet directed bcast to " << ifAddr.GetLocal ()); + Ptr packetCopy = p->Copy (); outInterface->Send (packetCopy, destination); result = true; } @@ -259,13 +260,14 @@ RawSocketImpl::SendByInterface (Ptr p, Ptr route) Ptr outInterface = m_ipv4->GetInterface (interface); NS_LOG_UNCOND ("Send via NetDevice ifIndex " << outDev->GetIfIndex () << " ipv4InterfaceIndex " << interface); - NS_ASSERT (packet->GetSize () <= outInterface->GetDevice ()->GetMtu ()); + NS_ASSERT (p->GetSize () <= outInterface->GetDevice ()->GetMtu ()); if (!route->GetGateway ().IsEqual (Ipv4Address ("0.0.0.0"))) { if (outInterface->IsUp ()) { NS_LOG_UNCOND ("Send to gateway " << route->GetGateway ()); - outInterface->Send (p, route->GetGateway ()); + Ptr packetCopy = p->Copy (); + outInterface->Send (packetCopy, route->GetGateway ()); } else { @@ -276,8 +278,9 @@ RawSocketImpl::SendByInterface (Ptr p, Ptr route) { if (outInterface->IsUp ()) { + Ptr packetCopy = p->Copy (); NS_LOG_UNCOND ("Send to destination " << destination); - outInterface->Send (packet,destination); + outInterface->Send (packetCopy, destination); } else { @@ -370,9 +373,9 @@ RawSocketImpl::ForwardUp (Ptr p, Ptr device) return false; } } - copy = p->Copy(); + Ptr packet = p->Copy(); struct Data data; - data.packet = copy; + data.packet = packet; data.fromIp = ipHeader.GetSource (); data.fromProtocol = ipHeader.GetProtocol (); m_recv.push_back (data); diff --git a/src/routing/aodv/aodv-routing-protocol.cc b/src/routing/aodv/aodv-routing-protocol.cc index 551efb288..c4cd4e512 100644 --- a/src/routing/aodv/aodv-routing-protocol.cc +++ b/src/routing/aodv/aodv-routing-protocol.cc @@ -494,7 +494,7 @@ RoutingProtocol::SendRequest (Ipv4Address dst, bool D, bool G) // Send RREQ as subnet directed broadcast from each (own) interface - Ptr packet = Create (); + for (std::map , Ipv4InterfaceAddress>::const_iterator j = m_socketAddresses.begin (); j != m_socketAddresses.end (); ++j) { Ptr socket = j->first; @@ -503,6 +503,7 @@ RoutingProtocol::SendRequest (Ipv4Address dst, bool D, bool G) rreqHeader.SetOrigin (iface.GetLocal ()); InsertRequestId (iface.GetLocal (), m_requestId); + Ptr packet = Create (); packet->AddHeader(rreqHeader); packet->AddHeader(tHeader); m_broadcastId++; @@ -722,15 +723,16 @@ RoutingProtocol::RecvRequest (Ptr p, Ipv4Address receiver, Ipv4Address s */ if(ipv4Header.GetTtl() < 2) return; - Ptr packet = Create (); - packet->AddHeader (rreqHeader); - TypeHeader tHeader (AODVTYPE_RREQ); - packet->AddHeader (tHeader); + for (std::map , Ipv4InterfaceAddress>::const_iterator j = m_socketAddresses.begin (); j != m_socketAddresses.end (); ++j) { Ptr socket = j->first; Ipv4InterfaceAddress iface = j->second; + Ptr packet = p->Copy(); + packet->AddHeader (rreqHeader); + TypeHeader tHeader (AODVTYPE_RREQ); + packet->AddHeader (tHeader); BuildPacket(/*packet*/packet, /*source port*/AODV_PORT, /*destination port*/AODV_PORT, /*source address*/iface.GetLocal (), /*destination address*/iface.GetBroadcast(), /*id*/ipv4Header.GetIdentification() , /*TTL*/ ipv4Header.GetTtl() - 1); socket->Send (packet);