diff --git a/src/internet-stack/ipv4-l3-protocol.cc b/src/internet-stack/ipv4-l3-protocol.cc index c3bbbf982..d3b7f5509 100644 --- a/src/internet-stack/ipv4-l3-protocol.cc +++ b/src/internet-stack/ipv4-l3-protocol.cc @@ -401,6 +401,7 @@ Ipv4L3Protocol::Receive( Ptr device, Ptr p, uint16_t pr for (SocketList::iterator i = m_sockets.begin (); i != m_sockets.end (); ++i) { + NS_LOG_LOGIC ("Forwarding to raw socket"); Ptr socket = *i; socket->ForwardUp (packet, ipHeader, device); } diff --git a/src/routing/aodv/aodv-packet.h b/src/routing/aodv/aodv-packet.h index 8916b106c..2c93bdf0e 100644 --- a/src/routing/aodv/aodv-packet.h +++ b/src/routing/aodv/aodv-packet.h @@ -36,10 +36,10 @@ namespace aodv { enum MessageType { - AODVTYPE_RREQ = 0x02, //!< AODVTYPE_RREQ - AODVTYPE_RREP = 0x04, //!< AODVTYPE_RREP - AODVTYPE_RERR = 0x08, //!< AODVTYPE_RERR - AODVTYPE_RREP_ACK = 0x10//!< AODVTYPE_RREP_ACK + AODVTYPE_RREQ = 1, //!< AODVTYPE_RREQ + AODVTYPE_RREP = 2, //!< AODVTYPE_RREP + AODVTYPE_RERR = 3, //!< AODVTYPE_RERR + AODVTYPE_RREP_ACK = 4//!< AODVTYPE_RREP_ACK }; /** diff --git a/src/routing/aodv/aodv-routing-protocol.cc b/src/routing/aodv/aodv-routing-protocol.cc index ad914c6f1..a2e39db32 100644 --- a/src/routing/aodv/aodv-routing-protocol.cc +++ b/src/routing/aodv/aodv-routing-protocol.cc @@ -22,8 +22,8 @@ * Ported to ns-3 by Elena Borovkova */ #include "aodv-routing-protocol.h" - #include "ns3/socket-factory.h" +#include "ns3/socket.h" #include "ns3/udp-socket-factory.h" #include "ns3/simulator.h" #include "ns3/log.h" @@ -37,6 +37,8 @@ #include "ns3/trace-source-accessor.h" #include "ns3/ipv4-header.h" #include "ns3/nstime.h" +#include "src/internet-stack/ipv4-raw-socket-impl.h" + /// UDP Port for AODV control traffic #define AODV_PORT 654 @@ -66,8 +68,6 @@ RoutingProtocol::LookupBroadcastId (Ipv4Address id, uint32_t bid) return true; return false; } - - void RoutingProtocol::PurgeBroadcastId () { @@ -136,7 +136,7 @@ RoutingProtocol::DoDispose () Ptr RoutingProtocol::RouteOutput (Ptr p, const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr) { - NS_LOG_FUNCTION (this << header.GetDestination()); + NS_LOG_FUNCTION (this << p->GetUid() << header.GetDestination()); Ptr rtentry; Ipv4Address dst = header.GetDestination(); aodv_rt_entry toDst; @@ -160,10 +160,34 @@ RoutingProtocol::RouteInput (Ptr p, const Ipv4Header &header, Ptr< UnicastForwardCallback ucb, MulticastForwardCallback mcb, LocalDeliverCallback lcb, ErrorCallback ecb) { - NS_LOG_FUNCTION (this << header.GetDestination() << idev->GetAddress()); + NS_LOG_FUNCTION (this << p->GetUid() << header.GetDestination() << idev->GetAddress()); + return false; +#if 0 + NS_ASSERT (m_ipv4 != 0); + // Check if input device supports IP + NS_ASSERT (m_ipv4->GetInterfaceForDevice (idev) >= 0); + uint32_t iif = m_ipv4->GetInterfaceForDevice (idev); + Ipv4Address dst = header.GetDestination(); + + for(std::vector::const_iterator j = m_myAddresses.begin(); j != m_myAddresses.end(); ++j) + { + if (j->GetLocal() == dst) + { + NS_LOG_LOGIC ("Local delivery of unicast"); + lcb(p,header, iif); + return true; + } + if (j->GetBroadcast() == dst) + { + NS_LOG_LOGIC ("Local delivery of broadcast"); + // TODO not duplicate + lcb(p,header, iif); + // TODO forward + return true; + } + } return false; - Ipv4Address dst = header.GetDestination(); Ptr rtentry; aodv_rt_entry toDst; if(rtable.rt_lookup(dst, toDst)) @@ -178,11 +202,13 @@ RoutingProtocol::RouteInput (Ptr p, const Ipv4Header &header, Ptr< return true; } return false; +#endif } void RoutingProtocol::SetIpv4 (Ptr ipv4) { + NS_LOG_FUNCTION (this); NS_ASSERT (ipv4 != 0); NS_ASSERT (m_ipv4 == 0); @@ -207,20 +233,20 @@ RoutingProtocol::Start () Ipv4Address addr = m_ipv4->GetAddress (i, 0).GetLocal (); if (addr == loopback) continue; - + m_myAddresses.push_back( m_ipv4->GetAddress (i, 0)); // Create a socket to listen only on this interface - Ptr socket = Socket::CreateSocket (GetObject (), - UdpSocketFactory::GetTypeId()); + Ptr socket = Socket::CreateSocket( GetObject (), TypeId::LookupByName ("ns3::Ipv4RawSocketFactory")); + NS_ASSERT (socket != 0); + socket->SetAttribute ("Protocol", UintegerValue (17)); // UDP + int status; + status = socket->Bind (InetSocketAddress (addr, AODV_PORT)); + NS_ASSERT (status != -1); socket->SetRecvCallback (MakeCallback (&RoutingProtocol::RecvAodv, this)); - if (socket->Bind (InetSocketAddress (addr, AODV_PORT))) - { - NS_FATAL_ERROR ("Failed to bind() AODV receive socket"); - } - socket->Connect (InetSocketAddress (Ipv4Address::GetBroadcast(), AODV_PORT)); + status = socket->Connect (InetSocketAddress (Ipv4Address::GetBroadcast(), AODV_PORT)); + NS_ASSERT (status != -1); m_socketAddresses.insert(std::make_pair(socket, addr)); m_addressSocket.insert(std::make_pair(addr, socket)); - NS_LOG_INFO ("Interface " << addr << " used by AODV"); } } @@ -252,11 +278,12 @@ RoutingProtocol::NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress a void RoutingProtocol::RecvAodv (Ptr socket) { - + NS_LOG_FUNCTION (this); Ptr packet; Address sourceAddress; packet = socket->RecvFrom (sourceAddress); - + Ipv4Header ipv4Header; + packet->RemoveHeader(ipv4Header); InetSocketAddress inetSourceAddr = InetSocketAddress::ConvertFrom (sourceAddress); Ipv4Address senderIfaceAddr = inetSourceAddr.GetIpv4 (); @@ -285,10 +312,10 @@ RoutingProtocol::RecvAodv (Ptr socket) if(t < Simulator::Now() + ACTIVE_ROUTE_TIMEOUT) toNeighbor.SetLifeTime(Simulator::Now() + ACTIVE_ROUTE_TIMEOUT); } - Ipv4Header ipv4Header; - packet->RemoveHeader(ipv4Header); TypeHeader tHeader(AODVTYPE_RREQ); packet->PeekHeader(tHeader); + if (!tHeader.IsValid()) + return; switch(tHeader.Get()) { case AODVTYPE_RREQ: @@ -298,7 +325,7 @@ RoutingProtocol::RecvAodv (Ptr socket) } case AODVTYPE_RREP: { - RecvReply (packet, ipv4Header, receiverIfaceAddr); + RecvReply (packet, receiverIfaceAddr, senderIfaceAddr); break; } case AODVTYPE_RERR: @@ -315,10 +342,8 @@ RoutingProtocol::RecvAodv (Ptr socket) void RoutingProtocol::RecvRequest (Ptr p, Ipv4Header & ipv4Header) { - - Ipv4Address src = ipv4Header.GetSource(); uint8_t ttl = ipv4Header.GetTtl(); - + Ipv4Address src = ipv4Header.GetSource(); TypeHeader tHeader(AODVTYPE_RREQ); p->RemoveHeader(tHeader); @@ -416,26 +441,23 @@ RoutingProtocol::RecvRequest (Ptr p, Ipv4Header & ipv4Header) // If a node does not generate a RREP the incoming IP header has // TTL larger than 1, the node updates and broadcasts the RREQ // to address 255.255.255.255 on each of its configured interfaces. - if(ttl > 1) + if (ttl > 1) { - ipv4Header.SetDestination(Ipv4Address("255.255.255.255")); + ipv4Header.SetDestination(Ipv4Address::GetBroadcast()); ttl--; ipv4Header.SetTtl(ttl); p->AddHeader(rreqHeader); p->AddHeader(tHeader); - for (uint32_t k = 0; k < m_ipv4->GetNInterfaces (); k++) + for(std::map< Ptr, Ipv4Address >::const_iterator j = m_socketAddresses.begin(); j != m_socketAddresses.end(); ++j) { - Ipv4Address addr = m_ipv4->GetAddress (k, 0).GetLocal (); - if (addr != loopback) - { - ipv4Header.SetSource(addr); - p->AddHeader(ipv4Header); - std::map< Ipv4Address, Ptr >::const_iterator j = m_addressSocket.find(addr); - j->second->Send(p); - p->RemoveHeader(ipv4Header); - } + Ipv4Address myInterfaceAddress = j->second; + ipv4Header.SetSource(myInterfaceAddress); + p->AddHeader(ipv4Header); + j->first->Send(p); + p->RemoveHeader(ipv4Header); } + btimer.SetDelay(BCAST_ID_SAVE); btimer.Schedule(); htimer.SetDelay(HELLO_INTERVAL); @@ -451,7 +473,7 @@ RoutingProtocol::RecvRequest (Ptr p, Ipv4Header & ipv4Header) } void -RoutingProtocol::RecvReply (Ptr p, Ipv4Header & ipv4Header, Ipv4Address myAddress) +RoutingProtocol::RecvReply (Ptr p, Ipv4Address my ,Ipv4Address src) { TypeHeader tHeader(AODVTYPE_RREP); p->RemoveHeader(tHeader); @@ -482,9 +504,9 @@ RoutingProtocol::RecvReply (Ptr p, Ipv4Header & ipv4Header, Ipv4Address toDst.SetDest(rrepHeader.GetDst()); toDst.SetFlag(RTF_UP); toDst.SetHop(hop); - toDst.SetInterface(ipv4Header.GetDestination()); + toDst.SetInterface(my); toDst.SetLifeTime(Simulator::Now() + rrepHeader.GetLifeTime()); - toDst.SetNextHop(ipv4Header.GetSource()); + toDst.SetNextHop(src); toDst.SetSeqNo(rrepHeader.GetDstSeqno()); toDst.SetValidSeqNo(true); } @@ -498,7 +520,7 @@ RoutingProtocol::RecvReply (Ptr p, Ipv4Header & ipv4Header, Ipv4Address toDst.SetSeqNo(rrepHeader.GetDstSeqno()); toDst.SetValidSeqNo(true); toDst.SetFlag(RTF_UP); - toDst.SetNextHop(ipv4Header.GetSource()); + toDst.SetNextHop(src); toDst.SetLifeTime(Simulator::Now() + rrepHeader.GetLifeTime()); toDst.SetHop(hop); } @@ -509,7 +531,7 @@ RoutingProtocol::RecvReply (Ptr p, Ipv4Header & ipv4Header, Ipv4Address { toDst.SetSeqNo(rrepHeader.GetDstSeqno()); toDst.SetFlag(RTF_UP); - toDst.SetNextHop(ipv4Header.GetSource()); + toDst.SetNextHop(src); toDst.SetLifeTime(Simulator::Now() + rrepHeader.GetLifeTime()); toDst.SetHop(hop); } @@ -519,7 +541,7 @@ RoutingProtocol::RecvReply (Ptr p, Ipv4Header & ipv4Header, Ipv4Address if( (rrepHeader.GetDstSeqno() == toDst.GetSeqNo()) && (toDst.GetFlag() != RTF_UP) ) { toDst.SetFlag(RTF_UP); - toDst.SetNextHop(ipv4Header.GetSource()); + toDst.SetNextHop(src); toDst.SetLifeTime(Simulator::Now() + rrepHeader.GetLifeTime()); toDst.SetHop(hop); } @@ -528,13 +550,13 @@ RoutingProtocol::RecvReply (Ptr p, Ipv4Header & ipv4Header, Ipv4Address else if( (rrepHeader.GetDstSeqno() == toDst.GetSeqNo()) && (hop < toDst.GetHop()) ) { toDst.SetFlag(RTF_UP); - toDst.SetNextHop(ipv4Header.GetSource()); + toDst.SetNextHop(src); toDst.SetLifeTime(Simulator::Now() + rrepHeader.GetLifeTime()); toDst.SetHop(hop); } } - if(myAddress == rrepHeader.GetOrigin()) + if(my == rrepHeader.GetOrigin()) { //TODO may be send messeges from queue return; @@ -558,11 +580,10 @@ RoutingProtocol::RecvReply (Ptr p, Ipv4Header & ipv4Header, Ipv4Address toNextHopToDst.pc_insert(toOrigin.GetNextHop()); // TODO add operation over unidirctinal links - ipv4Header.SetSource(toOrigin.GetInterface()); - ipv4Header.SetDestination(toOrigin.GetNextHop()); +// ipv4Header.SetSource(toOrigin.GetInterface()); +// ipv4Header.SetDestination(toOrigin.GetNextHop()); p->AddHeader(rrepHeader); p->AddHeader(tHeader); - p->AddHeader(ipv4Header); std::map< Ipv4Address, Ptr >::const_iterator j = m_addressSocket.find(toOrigin.GetInterface()); j->second->Send(p); } @@ -625,12 +646,15 @@ RoutingProtocol::SendRequest (Ipv4Address dst, bool G, bool D) { NS_LOG_FUNCTION (this << dst); TypeHeader tHeader(AODVTYPE_RREQ); - + Ipv4Header ipv4Header; RreqHeader rreqHeader; rreqHeader.SetDst(dst); aodv_rt_entry rt; if(rtable.rt_lookup(dst, rt)) + { rreqHeader.SetHopCount(rt.GetLastValidHopCount()); + rreqHeader.SetDstSeqno(rt.GetSeqNo()); + } else rreqHeader.SetUnknownSeqno(true); if(G) @@ -643,16 +667,20 @@ RoutingProtocol::SendRequest (Ipv4Address dst, bool G, bool D) rreqHeader.SetId(bid); rreqHeader.SetHopCount(0); Ptr packet = Create (); - std::map< Ptr, Ipv4Address >::const_iterator j; - for(j = m_socketAddresses.begin(); j != m_socketAddresses.end(); ++j) + for(std::map< Ptr, Ipv4Address >::const_iterator j = m_socketAddresses.begin(); j != m_socketAddresses.end(); ++j) { - Ipv4Address addr = j->second; - rreqHeader.SetOrigin(addr); - InsertBroadcastId(addr, bid); + Ipv4Address myInterfaceAddress = j->second; + + ipv4Header.SetDestination(dst); + ipv4Header.SetSource(myInterfaceAddress); + ipv4Header.SetTtl(NET_DIAMETER); + NS_LOG_INFO("my interface address " << myInterfaceAddress); + rreqHeader.SetOrigin(myInterfaceAddress); + InsertBroadcastId(myInterfaceAddress, bid); packet->AddHeader(rreqHeader); packet->AddHeader(tHeader); - j->first->Send(packet); - + packet->AddHeader(ipv4Header); + j->first->Send(packet,0); } // htimer.SetDelay(HELLO_INTERVAL); diff --git a/src/routing/aodv/aodv-routing-protocol.h b/src/routing/aodv/aodv-routing-protocol.h index 2a8bd374d..f171dab29 100644 --- a/src/routing/aodv/aodv-routing-protocol.h +++ b/src/routing/aodv/aodv-routing-protocol.h @@ -28,6 +28,8 @@ #include "aodv-rqueue.h" #include "aodv-packet.h" +#include "src/internet-stack/ipv4-l3-protocol.h" + #include "ns3/object.h" #include "ns3/packet.h" #include "ns3/node.h" @@ -139,9 +141,11 @@ private: /// IP protocol Ptr m_ipv4; + Ptr m_ipv4L3; /// UDP socket per each IP interface, map socket -> iface std::map< Ptr, Ipv4Address > m_socketAddresses; std::map< Ipv4Address, Ptr > m_addressSocket; + std::vector m_myAddresses; /// Routing table aodv_rtable rtable; @@ -154,6 +158,7 @@ private: /// Sequence Number (???) uint32_t seqno; + private: /// Start protocol operation @@ -170,9 +175,9 @@ private: /// Receive and process control packet void RecvAodv (Ptr socket); /// Receive RREQ - void RecvRequest (Ptr p, Ipv4Header & header); + void RecvRequest (Ptr p, Ipv4Header & ipv4Header); /// Receive RREP - void RecvReply (Ptr p, Ipv4Header & ipv4Header, Ipv4Address myAddress); + void RecvReply (Ptr p, Ipv4Address my ,Ipv4Address src); /// Receive RERR void RecvError (Ptr p); //\}