diff dsr/model/dsr-routing.cc src/dsr/model/dsr-routing.cc 3191c3191 < Ptr propPacket = packet->Copy (); --- > Ptr propPacket = IncreasePacketRequestId (packet->Copy ()); 3197c3197 < ScheduleRreqRetry (packet, address, false, requestId, protocol); --- > ScheduleRreqRetry (packet, address, false, m_requestId, protocol); 3199a3200,3258 > } > > 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; diff dsr/model/dsr-routing.h src/dsr/model/dsr-routing.h 644c644,650 < --- > /** > * 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);