diff --git a/src/routing/aodv/aodv-routing-protocol.cc b/src/routing/aodv/aodv-routing-protocol.cc index f934937dc..ad914c6f1 100644 --- a/src/routing/aodv/aodv-routing-protocol.cc +++ b/src/routing/aodv/aodv-routing-protocol.cc @@ -129,6 +129,7 @@ RoutingProtocol::DoDispose () iter->first->Close (); } m_socketAddresses.clear (); + m_addressSocket.clear(); Ipv4RoutingProtocol::DoDispose (); } @@ -137,8 +138,20 @@ RoutingProtocol::RouteOutput (Ptr p, const Ipv4Header &header, uint32_t { NS_LOG_FUNCTION (this << header.GetDestination()); Ptr rtentry; - sockerr = Socket::ERROR_NOROUTETOHOST; - // TODO resolve route + Ipv4Address dst = header.GetDestination(); + aodv_rt_entry toDst; + if(!rtable.rt_lookup(dst, toDst)) + { + SendRequest(dst, false, false); + sockerr = Socket::ERROR_NOROUTETOHOST; + } + else + { + rtentry = Create (); + rtentry->SetDestination(dst); + rtentry->SetSource(toDst.GetInterface()); + rtentry->SetGateway(toDst.GetNextHop()); + } return rtentry; } @@ -147,8 +160,23 @@ RoutingProtocol::RouteInput (Ptr p, const Ipv4Header &header, Ptr< UnicastForwardCallback ucb, MulticastForwardCallback mcb, LocalDeliverCallback lcb, ErrorCallback ecb) { - NS_LOG_FUNCTION (this << header.GetDestination() << idev->GetAddress()); - // TODO + NS_LOG_FUNCTION (this << header.GetDestination() << idev->GetAddress()); + return false; + + Ipv4Address dst = header.GetDestination(); + Ptr rtentry; + aodv_rt_entry toDst; + if(rtable.rt_lookup(dst, toDst)) + { + rtentry->SetDestination(dst); + rtentry->SetGateway(toDst.GetNextHop()); + rtentry->SetSource(toDst.GetInterface()); + + uint32_t interfaceIdx = 0; + rtentry->SetOutputDevice(m_ipv4->GetNetDevice (interfaceIdx)); + ucb (rtentry, p, header); + return true; + } return false; } @@ -188,9 +216,11 @@ RoutingProtocol::Start () { NS_FATAL_ERROR ("Failed to bind() AODV receive socket"); } - socket->Connect (InetSocketAddress (Ipv4Address (0xffffffff), AODV_PORT)); + socket->Connect (InetSocketAddress (Ipv4Address::GetBroadcast(), AODV_PORT)); m_socketAddresses.insert(std::make_pair(socket, addr)); + m_addressSocket.insert(std::make_pair(addr, socket)); + NS_LOG_INFO ("Interface " << addr << " used by AODV"); } } @@ -222,10 +252,12 @@ RoutingProtocol::NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress a void RoutingProtocol::RecvAodv (Ptr socket) { + Ptr packet; Address sourceAddress; packet = socket->RecvFrom (sourceAddress); + InetSocketAddress inetSourceAddr = InetSocketAddress::ConvertFrom (sourceAddress); Ipv4Address senderIfaceAddr = inetSourceAddr.GetIpv4 (); Ipv4Address receiverIfaceAddr = m_socketAddresses[socket]; @@ -234,14 +266,56 @@ RoutingProtocol::RecvAodv (Ptr socket) NS_LOG_DEBUG ("AODV node " << this << " received a AODV packet from " << senderIfaceAddr << " to " << receiverIfaceAddr); NS_ASSERT (inetSourceAddr.GetPort () == AODV_PORT); + + aodv_rt_entry toNeighbor; + if(!rtable.rt_lookup(senderIfaceAddr, toNeighbor )) + { + toNeighbor.SetDest(senderIfaceAddr); + toNeighbor.SetFlag(RTF_UP); + toNeighbor.SetHop(1); + toNeighbor.SetInterface(receiverIfaceAddr); + toNeighbor.SetLifeTime(Simulator::Now() + ACTIVE_ROUTE_TIMEOUT); + toNeighbor.SetNextHop(senderIfaceAddr); + toNeighbor.SetValidSeqNo(false); + } + else + { + toNeighbor.SetFlag(RTF_UP); + Time t = toNeighbor.GetLifeTime(); + 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); + switch(tHeader.Get()) + { + case AODVTYPE_RREQ: + { + RecvRequest(packet, ipv4Header); + break; + } + case AODVTYPE_RREP: + { + RecvReply (packet, ipv4Header, receiverIfaceAddr); + break; + } + case AODVTYPE_RERR: + { + RecvError (packet); + } + case AODVTYPE_RREP_ACK: + break; + } + // TODO check packet type and call RecvSmth } void -RoutingProtocol::RecvRequest (Ptr p) +RoutingProtocol::RecvRequest (Ptr p, Ipv4Header & ipv4Header) { - Ipv4Header ipv4Header; - p->RemoveHeader(ipv4Header); + Ipv4Address src = ipv4Header.GetSource(); uint8_t ttl = ipv4Header.GetTtl(); @@ -377,10 +451,8 @@ RoutingProtocol::RecvRequest (Ptr p) } void -RoutingProtocol::RecvReply (Ptr p, Ipv4Address myAddress) +RoutingProtocol::RecvReply (Ptr p, Ipv4Header & ipv4Header, Ipv4Address myAddress) { - Ipv4Header ipv4Header; - p->RemoveHeader(ipv4Header); TypeHeader tHeader(AODVTYPE_RREP); p->RemoveHeader(tHeader); RrepHeader rrepHeader; @@ -486,8 +558,6 @@ RoutingProtocol::RecvReply (Ptr p, Ipv4Address myAddress) toNextHopToDst.pc_insert(toOrigin.GetNextHop()); // TODO add operation over unidirctinal links -// ipv4Header.SetProtocol( ? ); -// ipv4Header.SetTtl(?); ipv4Header.SetSource(toOrigin.GetInterface()); ipv4Header.SetDestination(toOrigin.GetNextHop()); p->AddHeader(rrepHeader); @@ -553,13 +623,9 @@ RoutingProtocol::SendHello () void RoutingProtocol::SendRequest (Ipv4Address dst, bool G, bool D) { + NS_LOG_FUNCTION (this << dst); TypeHeader tHeader(AODVTYPE_RREQ); - Ipv4Header ipv4Header; - ipv4Header.SetTtl(NET_DIAMETER); - ipv4Header.SetDestination(dst); -//ipv4Header.SetProtocol( ? ); - RreqHeader rreqHeader; rreqHeader.SetDst(dst); aodv_rt_entry rt; @@ -576,28 +642,21 @@ RoutingProtocol::SendRequest (Ipv4Address dst, bool G, bool D) bid++; rreqHeader.SetId(bid); rreqHeader.SetHopCount(0); - Ipv4Address loopback ("127.0.0.1"); - for (uint32_t k = 0; k < m_ipv4->GetNInterfaces (); k++) + Ptr packet = Create (); + std::map< Ptr, Ipv4Address >::const_iterator j; + for(j = m_socketAddresses.begin(); j != m_socketAddresses.end(); ++j) { - Ipv4Address addr = m_ipv4->GetAddress (k, 0).GetLocal (); - if (addr != loopback) - { - ipv4Header.SetSource(addr); - rreqHeader.SetOrigin(addr); - InsertBroadcastId(addr, bid); - Ptr packet = Create (); - packet->AddHeader(rreqHeader); - packet->AddHeader(tHeader); - packet->AddHeader(ipv4Header); - std::map< Ipv4Address, Ptr >::const_iterator j = m_addressSocket.find(addr); - j->second->Send(packet); + Ipv4Address addr = j->second; + rreqHeader.SetOrigin(addr); + InsertBroadcastId(addr, bid); + packet->AddHeader(rreqHeader); + packet->AddHeader(tHeader); + j->first->Send(packet); - } } - btimer.SetDelay(BCAST_ID_SAVE); - btimer.Schedule(); - htimer.SetDelay(HELLO_INTERVAL); - htimer.Schedule(); + +// htimer.SetDelay(HELLO_INTERVAL); +// htimer.Schedule(); } @@ -650,8 +709,7 @@ RoutingProtocol::SendReplyByIntermediateNode(aodv_rt_entry & toDst, aodv_rt_entr toOrigin.pc_insert(toDst.GetNextHop()); Ipv4Header ipv4Header; -// ipv4Header.SetTtl(?) -// ipv4Header.SetProtocol(?) + ipv4Header.SetSource(toOrigin.GetInterface()); ipv4Header.SetDestination(toOrigin.GetNextHop()); @@ -670,8 +728,7 @@ RoutingProtocol::SendReplyByIntermediateNode(aodv_rt_entry & toDst, aodv_rt_entr rrepHeader.SetOrigin(toDst.GetDest()); rrepHeader.SetLifeTime(toOrigin.GetLifeTime() - Simulator::Now()); -// ipv4Header.SetTtl(?) -// ipv4Header.SetProtocol(?) + ipv4Header.SetSource(toDst.GetInterface()); ipv4Header.SetDestination(toDst.GetNextHop()); diff --git a/src/routing/aodv/aodv-routing-protocol.h b/src/routing/aodv/aodv-routing-protocol.h index c1738d3fa..2a8bd374d 100644 --- a/src/routing/aodv/aodv-routing-protocol.h +++ b/src/routing/aodv/aodv-routing-protocol.h @@ -168,11 +168,11 @@ private: ///\name Recv //\{ /// Receive and process control packet - void RecvAodv (Ptr s); + void RecvAodv (Ptr socket); /// Receive RREQ - void RecvRequest (Ptr p); + void RecvRequest (Ptr p, Ipv4Header & header); /// Receive RREP - void RecvReply (Ptr p, Ipv4Address myAddress); + void RecvReply (Ptr p, Ipv4Header & ipv4Header, Ipv4Address myAddress); /// Receive RERR void RecvError (Ptr p); //\} diff --git a/src/routing/aodv/aodv-rtable.h b/src/routing/aodv/aodv-rtable.h index 4a19580f2..f07c3ce27 100644 --- a/src/routing/aodv/aodv-rtable.h +++ b/src/routing/aodv/aodv-rtable.h @@ -90,8 +90,8 @@ public: bool GetValidSeqNo() const { return validSeqNo; } void SetSeqNo(uint32_t sn) { rt_seqno = sn; } uint32_t GetSeqNo() const { return rt_seqno; } - void SetInterface(Ipv4Address in) { rt_interface = in; } - Ipv4Address GetInterface() const { return rt_interface; } + void SetInterface(Ipv4Address in) { interface = in; } + Ipv4Address GetInterface() const { return interface; } void SetHop(uint16_t hop) { rt_hops = hop; } uint16_t GetHop() const {return rt_hops; } void SetNextHop(Ipv4Address next) { rt_nexthop = next; } @@ -124,8 +124,7 @@ private: bool validSeqNo; /// Destination Sequence Number, if validSeqNo = true uint32_t rt_seqno; - /// Interface address - Ipv4Address rt_interface; + Ipv4Address interface; ///< Interface index /// Hop Count (number of hops needed to reach destination) uint16_t rt_hops; /// Last valid hop count