|
|
| 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; |