|
3191 |
Ptr<Packet> propPacket = packet->Copy (); |
3191 |
Ptr<Packet> propPacket = IncreasePacketRequestId (packet->Copy ()); |
3192 |
-- |
|
|
|
3197 |
ScheduleRreqRetry (packet, address, false, requestId, protocol); |
3197 |
ScheduleRreqRetry (packet, address, false, m_requestId, protocol); |
3198 |
-- |
|
|
|
|
|
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; |