--- dsr/model/dsr-routing.cc +++ dsr/model/dsr-routing.cc @@ -3191,1 +3191,1 @@ - Ptr propPacket = packet->Copy (); --- + Ptr propPacket = IncreasePacketRequestId (packet->Copy ()); @@ -3197,1 +3197,1 @@ - ScheduleRreqRetry (packet, address, false, requestId, protocol); --- + ScheduleRreqRetry (packet, address, false, m_requestId, protocol); @@ -3200,0 +3200,59 @@ +} + +Ptr +DsrRouting::IncreasePacketRequestId (Ptr packet) +{ + Ptr p = packet->Copy (); + DsrRoutingHeader dsrHeader; + p->RemoveHeader (dsrHeader); // Remove the DSR header in whole + uint32_t offset = dsrHeader.GetDsrOptionsOffset (); // Get the offset for option header, 8 bytes in this case + + // Remove dsr routing header + packet->RemoveAtStart (offset); + Ptr returnedPacket = Create (); + // prepare for obtaining rreq header + uint8_t buf[2]; + packet->CopyData (buf, sizeof(buf)); + uint8_t numberAddress = (buf[1] - 6) / 4; + DsrOptionRreqHeader rreq; + rreq.SetNumberAddress (numberAddress); + packet->RemoveHeader (rreq); + + // Recreate set of headers starting from routing header + DsrRoutingHeader dsrRoutingHeader; + dsrRoutingHeader.SetNextHeader (dsrHeader.GetNextHeader()); + dsrRoutingHeader.SetMessageType (dsrHeader.GetMessageType()); + dsrRoutingHeader.SetSourceId (dsrHeader.GetSourceId()); + dsrRoutingHeader.SetDestId (dsrHeader.GetDestId()); + // recreate rreq header + DsrOptionRreqHeader rreqHeader; + rreqHeader.AddNodeAddress (m_mainAddress); // Add our own address in the header + rreqHeader.SetTarget (rreq.GetTarget()); + m_requestId = m_rreqTable->CheckUniqueRreqId (rreq.GetTarget()); // Check the Id cache for duplicate ones + rreqHeader.SetId(m_requestId); // assign new request ID + // in case there is an error header, also add it to the set of copied headers + if (packet->GetSize()) + { + NS_LOG_DEBUG("Error header included"); + DsrOptionRerrUnreachHeader rerr; // recreate error header + packet->RemoveHeader(rerr); + + DsrOptionRerrUnreachHeader newUnreach; + newUnreach.SetErrorType (rerr.GetErrorType()); + newUnreach.SetErrorSrc (rerr.GetErrorSrc()); + newUnreach.SetUnreachNode (rerr.GetUnreachNode()); + newUnreach.SetErrorDst (rerr.GetErrorDst()); + newUnreach.SetSalvage (rerr.GetSalvage ()); // Set the value about whether to salvage a packet or not + uint16_t length = rreq.GetLength () + newUnreach.GetLength (); + dsrRoutingHeader.SetPayloadLength (length + 4); + dsrRoutingHeader.AddDsrOption (rreq); + dsrRoutingHeader.AddDsrOption (newUnreach); + } + else + { + dsrRoutingHeader.AddDsrOption (rreqHeader); // Add the rreqHeader to the dsr extension header + uint8_t length = rreqHeader.GetLength (); + dsrRoutingHeader.SetPayloadLength (uint16_t (length) + 2); + } + returnedPacket->AddHeader (dsrRoutingHeader); + return returnedPacket; --- dsr/model/dsr-routing.h +++ dsr/model/dsr-routing.h @@ -644,1 +644,7 @@ - --- + /** + * Increase route request packet ID number, while copying all necessary headers + * Method called inside RouteRequestTimerExpire + * + * \param packet Packet, from which DsrRouting, DsrOptionRreq and DsrOptionRerrUnreach headers are copied + */ + Ptr IncreasePacketRequestId (Ptr packet);