View | Details | Raw Unified | Return to bug 1917
Collapse All | Expand All

(-)dsr/model/dsr-routing.cc (-4 / +61 lines)
Line 3191    Link Here 
3191
      Ptr<Packet> propPacket = packet->Copy ();
3191
      Ptr<Packet> propPacket = IncreasePacketRequestId (packet->Copy ());
3192
--
Line 3197    Link Here 
3197
      ScheduleRreqRetry (packet, address, false, requestId, protocol);
3197
      ScheduleRreqRetry (packet, address, false, m_requestId, protocol);
3198
--
Line 3200    Link Here 
3200
}
3201
3202
Ptr<Packet>
3203
DsrRouting::IncreasePacketRequestId (Ptr<Packet> packet)
3204
{
3205
  Ptr<Packet> p = packet->Copy ();
3206
  DsrRoutingHeader dsrHeader;
3207
  p->RemoveHeader (dsrHeader);          // Remove the DSR header in whole
3208
  uint32_t offset = dsrHeader.GetDsrOptionsOffset ();   // Get the offset for option header, 8 bytes in this case
3209
3210
  // Remove dsr routing header
3211
  packet->RemoveAtStart (offset);
3212
  Ptr<Packet> returnedPacket = Create<Packet> ();
3213
  // prepare for obtaining rreq header
3214
  uint8_t buf[2];
3215
  packet->CopyData (buf, sizeof(buf));
3216
  uint8_t numberAddress = (buf[1] - 6) / 4;
3217
  DsrOptionRreqHeader rreq;
3218
  rreq.SetNumberAddress (numberAddress);
3219
  packet->RemoveHeader (rreq);
3220
3221
  // Recreate set of headers starting from routing header
3222
  DsrRoutingHeader dsrRoutingHeader;
3223
  dsrRoutingHeader.SetNextHeader (dsrHeader.GetNextHeader());
3224
  dsrRoutingHeader.SetMessageType (dsrHeader.GetMessageType());
3225
  dsrRoutingHeader.SetSourceId (dsrHeader.GetSourceId());
3226
  dsrRoutingHeader.SetDestId (dsrHeader.GetDestId());
3227
  // recreate rreq header
3228
  DsrOptionRreqHeader rreqHeader;
3229
  rreqHeader.AddNodeAddress (m_mainAddress);    // Add our own address in the header
3230
  rreqHeader.SetTarget (rreq.GetTarget());
3231
  m_requestId = m_rreqTable->CheckUniqueRreqId (rreq.GetTarget());      // Check the Id cache for duplicate ones
3232
  rreqHeader.SetId(m_requestId);        // assign new request ID
3233
  // in case there is an error header, also add it to the set of copied headers
3234
  if (packet->GetSize())
3235
    {
3236
      NS_LOG_DEBUG("Error header included");
3237
      DsrOptionRerrUnreachHeader rerr;  // recreate error header
3238
      packet->RemoveHeader(rerr);
3239
3240
      DsrOptionRerrUnreachHeader newUnreach;
3241
      newUnreach.SetErrorType (rerr.GetErrorType());
3242
      newUnreach.SetErrorSrc (rerr.GetErrorSrc());
3243
      newUnreach.SetUnreachNode (rerr.GetUnreachNode());
3244
      newUnreach.SetErrorDst (rerr.GetErrorDst());
3245
      newUnreach.SetSalvage (rerr.GetSalvage ()); // Set the value about whether to salvage a packet or not
3246
      uint16_t length = rreq.GetLength () + newUnreach.GetLength ();
3247
      dsrRoutingHeader.SetPayloadLength (length + 4);
3248
      dsrRoutingHeader.AddDsrOption (rreq);
3249
      dsrRoutingHeader.AddDsrOption (newUnreach);
3250
    }
3251
  else
3252
    {
3253
      dsrRoutingHeader.AddDsrOption (rreqHeader);                      // Add the rreqHeader to the dsr extension header
3254
      uint8_t length = rreqHeader.GetLength ();
3255
      dsrRoutingHeader.SetPayloadLength (uint16_t (length) + 2);
3256
    }
3257
  returnedPacket->AddHeader (dsrRoutingHeader);
3258
  return returnedPacket;
(-)dsr/model/dsr-routing.h (-2 / +7 lines)
Line 644    Link Here 
644
644
  /**
645
--
645
   * Increase route request packet ID number, while copying all necessary headers
646
   * Method called inside RouteRequestTimerExpire
647
   *
648
   * \param packet Packet, from which DsrRouting, DsrOptionRreq and DsrOptionRerrUnreach headers are copied
649
   */
650
  Ptr<Packet> IncreasePacketRequestId (Ptr<Packet> packet);

Return to bug 1917