2008年9月13日 星期六

NS2內DSDV疑似bug造成無窮迴圈的修正

最近在跑NS2,一開始跑很久都跑不完,
我還不以為意,以為是scenario太複雜,所以要跑很久...。
直到那天我放著模擬跑,人出去看電影,回來發現竟然還在跑(驚!),
我才覺得不對勁(也太遲鈍了吧.....囧)
反覆檢查後發現,程式在DSDV內會進入無窮迴圈,導致怎麼跑都跑不完。
於是就把dsdv.cc打開來修改一下:
ns-2.x/dsdv/dsdv.cc

void DSDV_Agent::processUpdate (Packet * p) function內,
約791行附近,有個 if 判斷這麼寫著:

// see if we can send off any packets we've got queued
if (rte.q && rte.metric != BIG)
{
Packet *queued_p;
while ((queued_p = rte.q->deque()))
// XXX possible loop here
// while ((queued_p = rte.q->deque()))
// Only retry once to avoid looping
// for (int jj = 0; jj <>length(); jj++){
// queued_p = rte.q->deque();
recv(queued_p, 0); // give the packets to ourselves to forward
// }
delete rte.q;
rte.q = 0;
table_->AddEntry(rte); // record the now zero'd queue
}


猜測這邊就是infinite loop形成的原因。
本來應該是要將queue裡面積存的packet取出然後送出,
可是會造成while永遠為true,形成無窮迴圈,bug就產生啦。
將它改成以下,應該就沒問題了


// see if we can send off any packets we've got queued
if (rte.q && rte.metric != BIG)
{
Packet *queued_p;
printf("DEGUB => in DSDV_Agent::processUpdate:795, rte.q->length()= %d\n",rte.q->length() );
//printf is only for debug :P

Packet** temp_array = new Packet*[rte.q->length()] ;

for(int i=0; i< rte.q->length(); i++){
temp_array[i] = rte.q->deque();
}

for(int i=0; i< rte.q->length(); i++){
recv(temp_array[i], 0);
}

delete rte.q;
rte.q = 0;
table_->AddEntry(rte); // record the now zero'd queue
}


//--
萬分感謝千益學弟,以及gdb的幫忙^_________^

至於blog中顯示程式碼區塊的方法,請參考:p
http://hdj-berkeley.blogspot.com/2008/06/blog.html
Related Posts with Thumbnails