2008年4月17日 星期四

Error message: jump to case label

因為有修改NS2其本來的code,在compile時,跳出"jump to case label"的錯誤訊息,後來在網路上看到解決的方法,原來是使用switch/case的時候,若是case內部有宣告區域變數,則必須用大括號將case內的code刮起來,如下範例:

未使用區域變數:
switch (S){
case 'A':
...
break;

case 'B':
...
break;

default:
...
break;
}

若有使用區域變數:
switch (S){
case 'A':
{int counter;
...
break;}

case 'B':
...
break;

default:
...
break;
}

編譯器: gcc
End~~

2008年4月12日 星期六

Error message: multiple types in one declaration

今天在增加NS2-mac802_16pkt.h的struct時,在編譯的時候發生了問題"multiple types in one declaration",一開始我還以為是根本來的NS2裡面內部所宣告的變數衝到,花了一下時間才發現...原來是自己所加的struct最後的大括號沒加到一個分號~~囧, 應該要這樣:struct XXX {...}; 以後一定要記得加分號阿阿阿阿阿阿阿~~~

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~

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~

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~

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()下的各參數.

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