由於NS2在跑模擬時,總是會遇到一些難以理解的錯誤...所以黃老師幫我們跟江清泉老師約在今天碰個面,希望他能為我們解開疑惑或是給個方向,在一個小時多的討論中,雖然沒有得到真正很明確的解決辦法~但是總算知道問題大概出在哪邊,目前最有可能發生錯誤的原因,是Memory被我們衝爆了(囧),所以江老師提供我們一個方法讓風哥可以即時的增加swap,以下為即時增加swap的方法:
Step1. dd if=/dev/zero of=/tmp/swap bs=1G count=20 (本來才2G的swap,打算多增加20G的swap)
Step2. mkswap /tmp/swap
Step3. swapon /tmp/swap
Step4. 若要在下次開機時能自動執行,則須在/etc/fstab加入下面那一行:
/tmp/swap swap swap defaults 0 0
革命尚未成功~同志仍須努力
End~~
2008年6月6日 星期五
NS2---BS佈建數量限制
當我在寫Tcl的時候,每次最多就只能佈建5個BS,但是我最多要佈建14個BS (囧a), 後來我用gdb來debug,發現每次在建到第六個BS時, 其MAC在 getPhy ()->setFrequency (tmp);的時候都會出錯, 後來我用display看了一下tmp~沒想到居然等於零~~~~,突然想到學長之前mac802_16.cc有一些修改的地方,我就開來比對一下,發現原本NIST預設static const int nbFreq = 5; 學長把它增加到static const int nbFreq = 45; 當然相對的學長也把frequencies的數量增加:
static const double frequencies[] = {3.367e+9,3.374e+9,3.381e+9,3.388e+9,3.395e+9,3.402e+9,3.409e+9,3.416e+9,3.423e+9,3.43e+9,3.437e+9,3.444e+9,3.451e+9,3.458e+9,3.465e+9,3.472e+9,3.479e+9, 3.486e+9, 3.493e+9, 3.5e+9, 3.507e+9, 535e+9,3.542e+9,3.549e+9,3.556e+9,3.563e+9,3.57e+9,3.577e+9,3.584e+9,3.591e+9,3.598e+9,3.605e+9,3.612e+9,3.619e+9,3.626e+9,3.633e+9,3.64e+9,3.647e+9,3.654e+9,3.661e+9,3.668e+9,3.675e+9 };
後來我也把數量增加後,在Tcl就可以成功佈建5個BS以上嚕 ^^,所以要是你需要建5個BS以上,記得要修改nbFreq 與 frequencies[].
End~
static const double frequencies[] = {3.367e+9,3.374e+9,3.381e+9,3.388e+9,3.395e+9,3.402e+9,3.409e+9,3.416e+9,3.423e+9,3.43e+9,3.437e+9,3.444e+9,3.451e+9,3.458e+9,3.465e+9,3.472e+9,3.479e+9, 3.486e+9, 3.493e+9, 3.5e+9, 3.507e+9, 535e+9,3.542e+9,3.549e+9,3.556e+9,3.563e+9,3.57e+9,3.577e+9,3.584e+9,3.591e+9,3.598e+9,3.605e+9,3.612e+9,3.619e+9,3.626e+9,3.633e+9,3.64e+9,3.647e+9,3.654e+9,3.661e+9,3.668e+9,3.675e+9 };
後來我也把數量增加後,在Tcl就可以成功佈建5個BS以上嚕 ^^,所以要是你需要建5個BS以上,記得要修改nbFreq 與 frequencies[].
End~
2008年6月4日 星期三
NS2---Debug tool
在撰寫NS2的過程中,compiler一定會遇到大大小小的錯誤,最令我厭惡的不外乎就是Segmentation fault (core dumped) 與 Floating point exceptionns, 特別是Segmentation fault 這種錯誤,要是不用tool根本很難找出它錯誤的地方. 為了解決這種錯誤, 就要請 "Valgrind" 出馬嚕(之前有試過gdb但是他回報的錯誤訊息太模糊了囧a,有時根本找不出錯誤真正的地方) !! 但是有個缺點~就是利用Valgrind來debug時會很花時間, 事事無完美嚕~只要找得出bug,就是好tool!!
Debug 指令: valgrind --tool=memcheck --leak-check=full --db-attach=yes ns ***.tcl > *** (valgrind 還有其他的option可以參考下列網址).
reference :
http://kaku26.blogspot.com/2008/06/blog-post_2013.html
http://citynight.blogbus.com/logs/11648949.html
End~
Debug 指令: valgrind --tool=memcheck --leak-check=full --db-attach=yes ns ***.tcl > *** (valgrind 還有其他的option可以參考下列網址).
reference :
http://kaku26.blogspot.com/2008/06/blog-post_2013.html
http://citynight.blogbus.com/logs/11648949.html
End~
2008年5月31日 星期六
Random walk model
我的論文中使用Random walk model, 在參照其官網的步驟編譯時,會產生幾個錯誤,其中有一個錯誤是必須把statistics.cc中,第66行的grid = new (int*) [x_]; 改為grid = new int* [x_]; 其餘的錯誤比較容易理解我就不在此贅述.
Random walk model 官網:
http://www.cs.rice.edu/~santa/research/mobility/
End~
Random walk model 官網:
http://www.cs.rice.edu/~santa/research/mobility/
End~
模擬時產生的錯誤---Classfier::no-slot{} default handler (tcl/lib/ns-lib.tcl)
今天在試跑模擬時,產生了一個error message :
--- Classfier::no-slot{} default handler (tcl/lib/ns-lib.tcl) ---
_o49: no target for slot 4294967295
_o49 type: Classifier/Portcontent dump:
---------- Finished standard no-slot{} default handler ----------
後來我上網查了一下,看到有人也有類似的問題,所幸友網友知道錯誤發生的原因 "http://www.nabble.com/problem:-Classfier::no-slot{}-default-handler-(tcl-lib-ns-lib.tcl)-to5616757.html" ,我看過後再重新檢查我自己的Tcl,發現原來我產生了一個udp(1) 卻在
" $ns connect $udp(1) $null(1)
$ns connect $udp(1) $null(2) "
重複定義了兩次其connect對象, (我想是因為這種原因,所以會發生這種問題吧!), 後來我將重複定義的connect修正後就解決此問題:) ~
End~
--- Classfier::no-slot{} default handler (tcl/lib/ns-lib.tcl) ---
_o49: no target for slot 4294967295
_o49 type: Classifier/Portcontent dump:
---------- Finished standard no-slot{} default handler ----------
後來我上網查了一下,看到有人也有類似的問題,所幸友網友知道錯誤發生的原因 "http://www.nabble.com/problem:-Classfier::no-slot{}-default-handler-(tcl-lib-ns-lib.tcl)-to5616757.html" ,我看過後再重新檢查我自己的Tcl,發現原來我產生了一個udp(1) 卻在
" $ns connect $udp(1) $null(1)
$ns connect $udp(1) $null(2) "
重複定義了兩次其connect對象, (我想是因為這種原因,所以會發生這種問題吧!), 後來我將重複定義的connect修正後就解決此問題:) ~
End~
2008年5月29日 星期四
透過封包CID取得SS
void xxx(Packet *p)
{
hdr_mac802_16 *wimaxHdr_req = HDR_MAC802_16(req);
gen_mac_header_t header_req = wimaxHdr_req->header;
....
PeerNode *peer;
peer = mac_->getCManager()->get_connection (header_req.cid, false)->getPeerNode(); //透過CID取出此CID的peer object
int index_ = peer->getPeerNode(); //取出peer object的index (mac)
}
{
hdr_mac802_16 *wimaxHdr_req = HDR_MAC802_16(req);
gen_mac_header_t header_req = wimaxHdr_req->header;
....
PeerNode *peer;
peer = mac_->getCManager()->get_connection (header_req.cid, false)->getPeerNode(); //透過CID取出此CID的peer object
int index_ = peer->getPeerNode(); //取出peer object的index (mac)
}
2008年4月10日 星期四
SS的Scheduler12---process_bsho_rsp()
當SS收到BS傳來的handoff respond後,會利用此memeber function執行相對應的程序,以下將會敘述member function的流程---
Step1. 首先會取出n_rec[].neighbor_bsid的值,並且與SS目前連線的BS做比對,要是相同則不執行後續動作;若是不同,就會把target BS的資訊取出來存至scan_info_的nbr內,
Step2. 再來就產生mac802_16_mob_ho_ind_frame frame,把frame的type設為MAC_MOB_HO_IND,以及設定一些參數,再將target_bsid設定為targetBS,在來就把packet enqueue.
Step3. 最後就設定scan_info_的handoff_timeout與substate(設為HANDOVER_PENDING).
End~
Step1. 首先會取出n_rec[].neighbor_bsid的值,並且與SS目前連線的BS做比對,要是相同則不執行後續動作;若是不同,就會把target BS的資訊取出來存至scan_info_的nbr內,
Step2. 再來就產生mac802_16_mob_ho_ind_frame frame,把frame的type設為MAC_MOB_HO_IND,以及設定一些參數,再將target_bsid設定為targetBS,在來就把packet enqueue.
Step3. 最後就設定scan_info_的handoff_timeout與substate(設為HANDOVER_PENDING).
End~
BS的Scheduler7---process_msho_req(Packet *req)
當BS收到SS所送來的packet時,將會執行此member function,以下將敘述此function流程---
Step1. 依序將req frame中的bs_full內的bs_rssi_mean相互比較,後可得到最大rssi的BS index.取得最大rssi的BS後,BS會執行send_nbr_adv().
Step2. 產生mac802_16_mob_bsho_rsp_frame frame,並且設定其相對應的參數,把frame type設為MAC_MOB_BSHO_RSP,並且把target BS的id存進n_rec[].neighbor_bsid.後續在設定一些數值後,就把packet enqueue.
End~
Step1. 依序將req frame中的bs_full內的bs_rssi_mean相互比較,後可得到最大rssi的BS index.取得最大rssi的BS後,BS會執行send_nbr_adv().
Step2. 產生mac802_16_mob_bsho_rsp_frame frame,並且設定其相對應的參數,把frame type設為MAC_MOB_BSHO_RSP,並且把target BS的id存進n_rec[].neighbor_bsid.後續在設定一些數值後,就把packet enqueue.
End~
SS的Scheduler11---send_msho_req ()
根據文件上的敘述,當SS收到MOB_SCN_RSP後會跟其他neighbor BS進行Scanning並且接收其DL MAP, UL MAP, DCD, UCD(進行同步的動作),並且會送MOB_SCN_REP給BS(但是我找不到這段程式碼在哪),接著SS會送出MOB_MSHO_REQ給BS,以下將敘述SS的send_msho_req ()流程---
Step1. 先取得peer node的head,在依序產生WimaxNeighborEntry,其內儲存neighbor的資訊.在判斷此node是否為發現過的neighbor,若是新的neighbor則nbrPref就加1.
Step2.若是nbrPref不為0的話,那SS就必須產生出request用的packet.產生packet,並且透過packet建立起一個frame,初始frame,並且把frame的type設為MAC_MOB_MSHO_REQ.接著設定report_metric, n_new_bs_index, n_new_bs_full...等等利用getStatWatch()取得訊號強度在利用average()算出rssi,再利用rssi算出bs_rssi_mean,並將其儲存至struct bs_current[]中,也把當下的peer node存進temp bsid內.
Step3. 開始收集neighor BS的rssi.根據neighbor 的數量產生WimaxNeighborEntry,在判斷此entry是否為已發現且跟目前的BS不同,若是的話,將會取出此BS的id,並且計算rssi跟rssi_mean,在將這些值存入至bs_full[]中.
Step4. 取出peer node的connection id並且存入至wimaxHdr的header.cid中,最後將packet enqueue.
End~
Step3. 開始收集neighor BS的rssi.根據neighbor 的數量產生WimaxNeighborEntry,在判斷此entry是否為已發現且跟目前的BS不同,若是的話,將會取出此BS的id,並且計算rssi跟rssi_mean,在將這些值存入至bs_full[]中.
Step4. 取出peer node的connection id並且存入至wimaxHdr的header.cid中,最後將packet enqueue.
End~
2008年4月9日 星期三
BS的Scheduler6---process_scan_request (Packet *req)
當BS收到SS所發出的MAC_MOB_SCN_REQ packet時,會執行process_scan_request (p),但是此member function主要是在wimaxctrlagent.cc內(不知道為何要把它寫在別的file~),以下將會敘述此function的流程---
Step1. 首先產生Scan_req物件entry,並且設定一些哩哩摳摳的參數,例如:delay, cid...等等.接著把scan_req的表頭加到list中.
Step2. 利用switch/case來判斷目前的default_association_level_為何.level主要有分成三種: (1) Scan without association, (2) Association without coordination, (3) Association with coordination.若是level為case1則透過entry來設定mac802_16_mob_scn_rsp_frame的相關參數;接著再根據nbmapentry_,依序將maptable_[i][0]內的值(第一row,紀錄node的mac address)放入rec_bs_full[]的recommended_bs_id(這個值似乎是紀錄被推薦的BS id),以及把scanning_type設為SCAN_WITHOUT_ASSOC,把被推薦的BS id都記錄好後,利用send_scan_response()把response傳回去.送回去後把entry remove~~.
Step2-2. 若是level為case2,跟Step2一樣設定mac802_16_mob_scn_rsp_frame的相關參數,把maptable_[][] 內的值放入rec_bs_full[]的recommended_bs_id,不同的是把scanning_type設為SCAN_ASSOC_LVL0,後續的動作則相同於Step2.
Step2-3. 若是level為case2,則會先將n_recommended_bs_index, n_recommended_bs_full, pending_rsp ()歸零,再根據nbmapentry_依序設定許多參數.先將wimax bs的type設為WIMAX_BS_SYNCH_REQ,將maptable_[][]設為目的地的address,接著利用port()取出目的端的port(應該是這樣XD),再經由getPeerNode取的設定Mac address.再來設定cid, scanning type, rdvt, rendezvous_time (不知道rdvt, rendezvous_time是作啥用的 囧),然後執行sned() (不知道是不是用這個function把packet送給SS).接著設定n_recommended_bs_full, recommended_bs_id,scanning_type以及rdv_time.最後,在初始化response()下的各參數.
Step1. 首先產生Scan_req物件entry,並且設定一些哩哩摳摳的參數,例如:delay, cid...等等.接著把scan_req的表頭加到list中.
Step2. 利用switch/case來判斷目前的default_association_level_為何.level主要有分成三種: (1) Scan without association, (2) Association without coordination, (3) Association with coordination.若是level為case1則透過entry來設定mac802_16_mob_scn_rsp_frame的相關參數;接著再根據nbmapentry_,依序將maptable_[i][0]內的值(第一row,紀錄node的mac address)放入rec_bs_full[]的recommended_bs_id(這個值似乎是紀錄被推薦的BS id),以及把scanning_type設為SCAN_WITHOUT_ASSOC,把被推薦的BS id都記錄好後,利用send_scan_response()把response傳回去.送回去後把entry remove~~.
Step2-2. 若是level為case2,跟Step2一樣設定mac802_16_mob_scn_rsp_frame的相關參數,把maptable_[][] 內的值放入rec_bs_full[]的recommended_bs_id,不同的是把scanning_type設為SCAN_ASSOC_LVL0,後續的動作則相同於Step2.
Step2-3. 若是level為case2,則會先將n_recommended_bs_index, n_recommended_bs_full, pending_rsp ()歸零,再根據nbmapentry_依序設定許多參數.先將wimax bs的type設為WIMAX_BS_SYNCH_REQ,將maptable_[][]設為目的地的address,接著利用port()取出目的端的port(應該是這樣XD),再經由getPeerNode取的設定Mac address.再來設定cid, scanning type, rdvt, rendezvous_time (不知道rdvt, rendezvous_time是作啥用的 囧),然後執行sned() (不知道是不是用這個function把packet送給SS).接著設定n_recommended_bs_full, recommended_bs_id,scanning_type以及rdv_time.最後,在初始化response()下的各參數.
2008年4月7日 星期一
SS的Scheduler10---process_ranging_rsp (mac802_16_rng_rsp_frame *frame)
當SS從MAC收到packet後,檢查其type若是為MAC_RNG_RSP,就會執行這個member function,以下將會敘述此member function流程---
Step1. 先判斷所收到的frame其所包含的SS address是否跟自己的address一樣,是的話就進行後續動作,不是的話就把frame drop掉.
Step2. 判斷frame內的ranging status為何種型態,在code裡面有分四種型態: (1) RNG_SUCCESS, (2) RNG_ABORT, (3) RNG_CONTINUE以及(4) RNG_RERANGE這四種,但是在code中主要只有針對第一種進行相對應的procedure.
Step3. 若是frame內的ranging status為RNG_SUCCESS,則把先前產生的request移除,並且判斷sub state是否為SCANNING,是的話將取出Mac backup的state (Mac備份的資訊包含BS id, frameduration, frame_number......等等)存回state_info中,並且把此neighber當為detected.接著把frame的資訊複製到另一mac802_16_rng_rsp_frame frame中,以及在scanning期間設定UCD message,並且變更到另一channel.
Step4. 若是sub state不是為SCANNING,則分別取出basic/primary connect.判斷basic connect是否為null以及其connection id是否跟傳回的frame basic id一樣,若是一樣則表示收到同一BS所回傳的frame,則不進行後續動作.若是不同且basic connect不為null,則把舊的basic/primary/secondary/outdate/indata connect刪除.利用所收到的mac802_16_rng_rsp_frame frame內其包含的basic/primary cid產生新的basic/parmary/upbasic/upprimary connection.並且透過這些connection把BS新增為peer node,並且將這些cid紀錄起來.
Step5. 把Mac state設為MAC802_16_REGISTER,並且執行send_registration().
End~~
Step1. 先判斷所收到的frame其所包含的SS address是否跟自己的address一樣,是的話就進行後續動作,不是的話就把frame drop掉.
Step2. 判斷frame內的ranging status為何種型態,在code裡面有分四種型態: (1) RNG_SUCCESS, (2) RNG_ABORT, (3) RNG_CONTINUE以及(4) RNG_RERANGE這四種,但是在code中主要只有針對第一種進行相對應的procedure.
Step3. 若是frame內的ranging status為RNG_SUCCESS,則把先前產生的request移除,並且判斷sub state是否為SCANNING,是的話將取出Mac backup的state (Mac備份的資訊包含BS id, frameduration, frame_number......等等)存回state_info中,並且把此neighber當為detected.接著把frame的資訊複製到另一mac802_16_rng_rsp_frame frame中,以及在scanning期間設定UCD message,並且變更到另一channel.
Step4. 若是sub state不是為SCANNING,則分別取出basic/primary connect.判斷basic connect是否為null以及其connection id是否跟傳回的frame basic id一樣,若是一樣則表示收到同一BS所回傳的frame,則不進行後續動作.若是不同且basic connect不為null,則把舊的basic/primary/secondary/outdate/indata connect刪除.利用所收到的mac802_16_rng_rsp_frame frame內其包含的basic/primary cid產生新的basic/parmary/upbasic/upprimary connection.並且透過這些connection把BS新增為peer node,並且將這些cid紀錄起來.
Step5. 把Mac state設為MAC802_16_REGISTER,並且執行send_registration().
End~~
SS的Scheduler9---send_scan_request ()
當SS移動時發生需要handoff的時候,SS就必須執行此member function, 以下將敘述此function的流程---
Step1. 首先會先判斷Mac的state是否為MAC802_16_CONNECTED,若是的話就往下進行後續動作.反之,則不進行後續動作.判斷是否有連線後,產生一packet,並且配給其n byte data buffer,再產生一mac802_16_mob_scn_req_frame的frame,並將frame的type設為MAC_MOB_SCN_REQ,後續設定其相關參數scan_duration, interleaving_interval......等等.
Step2. 設定好frame後,產生一peer node,利用此peer node取得connection id,並且將packet enqueue,準備送出去.
End~
Step1. 首先會先判斷Mac的state是否為MAC802_16_CONNECTED,若是的話就往下進行後續動作.反之,則不進行後續動作.判斷是否有連線後,產生一packet,並且配給其n byte data buffer,再產生一mac802_16_mob_scn_req_frame的frame,並將frame的type設為MAC_MOB_SCN_REQ,後續設定其相關參數scan_duration, interleaving_interval......等等.
Step2. 設定好frame後,產生一peer node,利用此peer node取得connection id,並且將packet enqueue,準備送出去.
End~
2008年4月6日 星期日
BS的Scheduler5---process_ranging_req (Packet *p)
當BS收到packet其型態為MAC_RNG_REQ,則BS就會呼叫此member function.以下將敘述此member function流程---
Step1. 判斷packet的header.cid是否為INITIAL_RANGING_CID,若是的話BS則會取出peer node (以SS的address作為參數),接著判斷peer node是否為null, 若是的話則利用CONN_BASIC與CONN_PRIMARY 建立出basic, upbasic, primary以及upprimary connection.
Step2. 增加connection CID後,開始增加Peer node的information. 先利用SS的address新增一個peer node,再來分別使用connection basic, primary設定peer node的Basic connection與Primary connection,設定好後再為connection設定peer node.最後利用SS的address新增的peer node,再mac上實際新增一個peer node,並且把basic與primary加到down_con_list_中, upbasic與upprimary 加到up_con_list_中.
Step3. 取得一個新的Packet,並且替他分配n byte data buffer. 將packet的data存至一ranging request frame中,並且設定此frame的type為MAC_RNG_RSP, ranging status為RNG_SUCCESS,frame的SS address為傳入此packet的address, 並將basic_cid, primary_cid...等等其他的參數一併封裝至frame中.來就是取得一burst,並且利用此burst為frame設定txtime,最後再將frame enqueue.
Step4. 若在step1.中peer不為null,則分別利用delay-intolerant message/delay-tolerant message取得basic/primary conneciton.後續就與step3.相同.
End~~
Step1. 判斷packet的header.cid是否為INITIAL_RANGING_CID,若是的話BS則會取出peer node (以SS的address作為參數),接著判斷peer node是否為null, 若是的話則利用CONN_BASIC與CONN_PRIMARY 建立出basic, upbasic, primary以及upprimary connection.
Step2. 增加connection CID後,開始增加Peer node的information. 先利用SS的address新增一個peer node,再來分別使用connection basic, primary設定peer node的Basic connection與Primary connection,設定好後再為connection設定peer node.最後利用SS的address新增的peer node,再mac上實際新增一個peer node,並且把basic與primary加到down_con_list_中, upbasic與upprimary 加到up_con_list_中.
Step3. 取得一個新的Packet,並且替他分配n byte data buffer. 將packet的data存至一ranging request frame中,並且設定此frame的type為MAC_RNG_RSP, ranging status為RNG_SUCCESS,frame的SS address為傳入此packet的address, 並將basic_cid, primary_cid...等等其他的參數一併封裝至frame中.來就是取得一burst,並且利用此burst為frame設定txtime,最後再將frame enqueue.
Step4. 若在step1.中peer不為null,則分別利用delay-intolerant message/delay-tolerant message取得basic/primary conneciton.後續就與step3.相同.
End~~
SS的Scheduler8---init_ragning()
當SS成功的收到UL MAP,並且正確的處裡它後,SS會執行init_ranging().以下將會敘述init_ranging()的流程---
Step1. 產生ulsubframe & dlsubframe,接著判斷substate是否為HANDOVER且判斷是否有收到DCD message, 若是符合條件則執行process_ranging_rsp().
Step2. 若是沒有符合step1.的條件,則會依序取得UL的各pdu,並且經由pdu取得burst.再判斷burst的IUC, ExtendedIUC以及FastRangingMacAddr是否分別為UIUC_EXT_UIUC, UIUC_FAST_RANGING與mac_->addr(),若是的話,則會取出一packet,並且設其id為INITIAL_RANGING_CID (預設為BROADCAST_CID),並產生一ranging frame,設定它的type為 MAC_RNG_REQ, Channel ID存入dc_id, ss_mac_address為SS的address, 設定傳輸時間,最後將Mac的state設為MAC802_16_WAIT_RNG_RSP.
Step3. 依序取得UL的各pud,並且經由pdu取得burst.再判斷burst的IUC是否為UIUC_INITIAL_RANGING, 若是的話取packet,並將其id設為INITIAL_RANGING_CID,後續的動作與Step2後半段相同. (觀察TCL所run出來的結果,一開始SS都是執行Step3.)
End~~
Step1. 產生ulsubframe & dlsubframe,接著判斷substate是否為HANDOVER且判斷是否有收到DCD message, 若是符合條件則執行process_ranging_rsp().
Step2. 若是沒有符合step1.的條件,則會依序取得UL的各pdu,並且經由pdu取得burst.再判斷burst的IUC, ExtendedIUC以及FastRangingMacAddr是否分別為UIUC_EXT_UIUC, UIUC_FAST_RANGING與mac_->addr(),若是的話,則會取出一packet,並且設其id為INITIAL_RANGING_CID (預設為BROADCAST_CID),並產生一ranging frame,設定它的type為 MAC_RNG_REQ, Channel ID存入dc_id, ss_mac_address為SS的address, 設定傳輸時間,最後將Mac的state設為MAC802_16_WAIT_RNG_RSP.
Step3. 依序取得UL的各pud,並且經由pdu取得burst.再判斷burst的IUC是否為UIUC_INITIAL_RANGING, 若是的話取packet,並將其id設為INITIAL_RANGING_CID,後續的動作與Step2後半段相同. (觀察TCL所run出來的結果,一開始SS都是執行Step3.)
End~~
2008年4月5日 星期六
SS的Scheduler7---process_ucd (mac802_16_dcd_frame *frame)
process_ucd()的procedure與process_ucu類似,所以我在這邊就不詳述每個流程,就點出不一樣的地方就好.在SS剛收到UCD時,會判斷Mac的state是否為MAC802_16_WAIT_DL_SYNCH或MAC802_16_WAIT_DL_SYNCH_DCD,若是得話則會丟棄此封包.繼續等待DL MAP或DCD.若Mac的state是MAC802_16_UL_PARAM則會進行封包複製的動作(類似於process_dcd (mac802_16_dcd_frame *frame),可參考"Scheduler6"),並且將Mac的state設為MAC802_16_RANGING以及重新設定t12timer.
End~~
End~~
SS的Scheduler6---process_dcd (mac802_16_dcd_frame *frame)
此member function主要是處裡當SS收到DCD的時候,該進行何種相對應的程序,以下將敘述此member funciton的流程---
Step1. 收到DCD後,首先會判斷Mac的state是否為MAC802_16_WAIT_DL_SYNCH,若是的話則不進行後續的動作,把封包丟棄.SS會繼續等DL MAP,等SS收到DL MAP後會將Mac state改為MAC802_16_WAIT_DL_SYNCH_DCD (可參照"SS的Scheduler5"),這樣後來收到DCD才會進行後續的動作.
Step2. 若受到DCD的時候,Mac的state為MAC802_16_WAIT_DL_SYNCH_DCD,則會設定Start time,並且判斷sub state是否為SCANNING.若是的話,則會將所收到的frame複製一份存到mac802_16_dcd_frame中,以備給handoff時使用.
Step3. 將Mac的state設為MAC802_16_UL_PARAM,並且設定T1timer.
End~~
Step1. 收到DCD後,首先會判斷Mac的state是否為MAC802_16_WAIT_DL_SYNCH,若是的話則不進行後續的動作,把封包丟棄.SS會繼續等DL MAP,等SS收到DL MAP後會將Mac state改為MAC802_16_WAIT_DL_SYNCH_DCD (可參照"SS的Scheduler5"),這樣後來收到DCD才會進行後續的動作.
Step2. 若受到DCD的時候,Mac的state為MAC802_16_WAIT_DL_SYNCH_DCD,則會設定Start time,並且判斷sub state是否為SCANNING.若是的話,則會將所收到的frame複製一份存到mac802_16_dcd_frame中,以備給handoff時使用.
Step3. 將Mac的state設為MAC802_16_UL_PARAM,並且設定T1timer.
End~~
SS的Scheduler5---process_dl_map (mac802_16_dl_map_frame *frame)
當SS收到packet時,若是其型態為DL MAP則就會呼叫到此function,以下將敘述此funciton的流程---
Step1. 當收到DL MAP後,SS則會先透過getPeerNode(frame->bsid)判斷是否為null,若是null則表示此BS是第一次接觸到,因此利用addPeerNode為此BS增加紀錄.
Step2. SS會先判斷Mac目前的state,若是為MAC802_16_WAIT_DL_SYNCH,則會進行一連串timer的設定,接著將Mac目前的state設為MAC802_16_WAIT_DL_SYNCH_DCD,並且判斷substate是否為HANDOVER或SCANNING,接著再判斷一次substate是否為SCANNING,若是會再判斷nbr是否為null,或是nbr list內有沒有目前送packet來的BS id,若是的話則會將此BS id存至nbr內(增加此BS為Peer node),接著再判斷若nbr是否為null,若是的話則利用此BS id新增成WimaxNeighborEntry並且將此BS新增為neighbor.否則會判斷此BS是否曾經發現過,是的話SS則會跳到下一個channel,並且執行lost_synch().
Step3. 在step2中第二次判斷是否為SCANNING時,若不是的話就不會進行後續增加nbr的動作. SS會取出DCD,接著判斷是否為null,若不是null則依序取得burst,並且判斷其IUC為何.若IUC為DIUC_END_OF_MAP,則將found設為false.
Step4. 若一開始判斷Mac目前的state,若不是MAC802_16_WAIT_DL_SYNCH,則會再判斷Mac State是否不為MAC802_16_WAIT_DL_SYNCH_DCD與MAC802_16_UL_PARAM,若能滿足這三個條件,將會重新設定reschedule的時間.
End~~
Step1. 當收到DL MAP後,SS則會先透過getPeerNode(frame->bsid)判斷是否為null,若是null則表示此BS是第一次接觸到,因此利用addPeerNode為此BS增加紀錄.
Step2. SS會先判斷Mac目前的state,若是為MAC802_16_WAIT_DL_SYNCH,則會進行一連串timer的設定,接著將Mac目前的state設為MAC802_16_WAIT_DL_SYNCH_DCD,並且判斷substate是否為HANDOVER或SCANNING,接著再判斷一次substate是否為SCANNING,若是會再判斷nbr是否為null,或是nbr list內有沒有目前送packet來的BS id,若是的話則會將此BS id存至nbr內(增加此BS為Peer node),接著再判斷若nbr是否為null,若是的話則利用此BS id新增成WimaxNeighborEntry並且將此BS新增為neighbor.否則會判斷此BS是否曾經發現過,是的話SS則會跳到下一個channel,並且執行lost_synch().
Step3. 在step2中第二次判斷是否為SCANNING時,若不是的話就不會進行後續增加nbr的動作. SS會取出DCD,接著判斷是否為null,若不是null則依序取得burst,並且判斷其IUC為何.若IUC為DIUC_END_OF_MAP,則將found設為false.
Step4. 若一開始判斷Mac目前的state,若不是MAC802_16_WAIT_DL_SYNCH,則會再判斷Mac State是否不為MAC802_16_WAIT_DL_SYNCH_DCD與MAC802_16_UL_PARAM,若能滿足這三個條件,將會重新設定reschedule的時間.
End~~
SS的Scheduler4---process (Packet *p)
process (Packet *P)主要是針對從MAC所收到的封包,判斷此封包的種類後進行相對應的procedure,以下將敘述process(Packet *p)的流程---
Step1. 將所收到的packet利用accessdata()存至mac802_16_dl_map_frame *frame,接著判斷此frame的type為何.
Step2. 若是frame的type為MAC_DL_MAP,則會先設定Start time,然後執行process_dl_map (frame); 若type為MAC_DCD, 則執行process_dcd ((mac802_16_dcd_frame*)frame); 若type為MAC_UL_MAP, 則執行process_ul_map ((mac802_16_ul_map_frame*)frame); 若type為MAC_UCD, 則執行process_ucd ((mac802_16_ucd_frame*)frame); 若type為MAC_RNG_RSP, 則執行process_ranging_rsp ((mac802_16_rng_rsp_frame*) frame); 若type為MAC_REG_RSP, 則執行process_reg_rsp ((mac802_16_reg_rsp_frame*) frame); 若type為MAC_MOB_SCN_RSP, 則執行process_scan_rsp ((mac802_16_mob_scn_rsp_frame *) frame); 若type為MAC_MOB_BSHO_RSP, 則執行process_bsho_rsp ((mac802_16_mob_bsho_rsp_frame *) frame); 若type為MAC_MOB_NBR_ADV, 則執行process_nbr_adv ((mac802_16_mob_nbr_adv_frame *) frame);
後續有機會的話我將會描述各個sub procedure的作用為何!!
End~
Step1. 將所收到的packet利用accessdata()存至mac802_16_dl_map_frame *frame,接著判斷此frame的type為何.
Step2. 若是frame的type為MAC_DL_MAP,則會先設定Start time,然後執行process_dl_map (frame); 若type為MAC_DCD, 則執行process_dcd ((mac802_16_dcd_frame*)frame); 若type為MAC_UL_MAP, 則執行process_ul_map ((mac802_16_ul_map_frame*)frame); 若type為MAC_UCD, 則執行process_ucd ((mac802_16_ucd_frame*)frame); 若type為MAC_RNG_RSP, 則執行process_ranging_rsp ((mac802_16_rng_rsp_frame*) frame); 若type為MAC_REG_RSP, 則執行process_reg_rsp ((mac802_16_reg_rsp_frame*) frame); 若type為MAC_MOB_SCN_RSP, 則執行process_scan_rsp ((mac802_16_mob_scn_rsp_frame *) frame); 若type為MAC_MOB_BSHO_RSP, 則執行process_bsho_rsp ((mac802_16_mob_bsho_rsp_frame *) frame); 若type為MAC_MOB_NBR_ADV, 則執行process_nbr_adv ((mac802_16_mob_nbr_adv_frame *) frame);
後續有機會的話我將會描述各個sub procedure的作用為何!!
End~
SS的Scheduler3---start_ulsubframe()
此篇文章將敘述start_ulsubframe() 的流程---
Step1. 先將PHY的state變成OFDM_SEND.
Step2. 取出目前的peer node head (意即取得BS), 再逐一取出Burst,然後判斷Burst的IUC是否為UIUC_INITIAL_RANGING或是UIUC_REQ_REGION_FULL,若是的話則利用Burst的cid取得此connection, 接著就會利用不同方式(by delay-intolerant messages, delay-tolerant messages, standard-based messages, data messages)取得connection,並且判斷conneciton是否為null, 若不是null則利用transfer_packets()算出duration.
Step3. 處裡完每個Burst後,再利用各種方式(by delay-intolerant messages, delay-tolerant messages, standard-based messages, data messages)取得connection, 並且為其增加request.
End~
Step1. 先將PHY的state變成OFDM_SEND.
Step2. 取出目前的peer node head (意即取得BS), 再逐一取出Burst,然後判斷Burst的IUC是否為UIUC_INITIAL_RANGING或是UIUC_REQ_REGION_FULL,若是的話則利用Burst的cid取得此connection, 接著就會利用不同方式(by delay-intolerant messages, delay-tolerant messages, standard-based messages, data messages)取得connection,並且判斷conneciton是否為null, 若不是null則利用transfer_packets()算出duration.
Step3. 處裡完每個Burst後,再利用各種方式(by delay-intolerant messages, delay-tolerant messages, standard-based messages, data messages)取得connection, 並且為其增加request.
End~
2008年4月4日 星期五
SS的Scheduler2---start_dlsubframe()
在此member function中主要是判斷scan_info_的substate為何,並且進行相對應的程序,以下將敘述start_dlsubframe()之流程---
Step1. 先將frame number加一,接著判斷scan_info_為何.在此主要考慮兩種state: (1) SCAN_PENDING, (2) HANDOVER_PENDING, 若state為SCAN_PENDING(與process_scan_rsp()相互呼應,在process_scan_rep()中會將scan_info_->state設為SCAN_PENDING),則會再判斷state轉為scanning前,frame的數量,若為0 則會執行resume_scanning() ;若是state為HANDOVER_PENDING, 則會判斷在執行handoff之前frame的數量,若是為0則會將state設定成HANDOVER, 並且設定Channel (相對的會設定到Frequency,Frequency包含3.486e+9, 3.493e+9, 3.5e+9, 3.507e+9, 3.514e+9),設定完後會呼叫lost_synch() function (主要是移除本來的peer node,取得新的peer node), 接著會增加peer node.
Step2. 設定new frame的Start time為NOW, 並啟動dlsubframe的handler,最後則位下一個frame重新排程.
End~
Step1. 先將frame number加一,接著判斷scan_info_為何.在此主要考慮兩種state: (1) SCAN_PENDING, (2) HANDOVER_PENDING, 若state為SCAN_PENDING(與process_scan_rsp()相互呼應,在process_scan_rep()中會將scan_info_->state設為SCAN_PENDING),則會再判斷state轉為scanning前,frame的數量,若為0 則會執行resume_scanning() ;若是state為HANDOVER_PENDING, 則會判斷在執行handoff之前frame的數量,若是為0則會將state設定成HANDOVER, 並且設定Channel (相對的會設定到Frequency,Frequency包含3.486e+9, 3.493e+9, 3.5e+9, 3.507e+9, 3.514e+9),設定完後會呼叫lost_synch() function (主要是移除本來的peer node,取得新的peer node), 接著會增加peer node.
Step2. 設定new frame的Start time為NOW, 並啟動dlsubframe的handler,最後則位下一個frame重新排程.
End~
訂閱:
文章 (Atom)