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

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~

2008年4月6日 星期日

發現需修改處!!??

恩...這陣子花了不少的時間在看BS & SS之間是如何運作,會這麼做的原因是因為~我需要在new call剛起來的時候,"BS會執行HNSS幫其選擇出一個最佳的BS給SS",但是目前SS在啟動init_rang()後,BS收到其RANG_REQ會無條件的同意其connect,建立起BS與SS間最初的連線.由此看來,要是我想實現HNSS for new call,那我應該在BS收到RAND_REQ的時候,進行某種判斷來啟動HNSS的運作.不要像目前NIST所預設的一樣,讓任何SS都可以直接connect!!
另外,HNSS要利用不同的criteria,因此有兩種想法來決定SS的target BS是誰:
Case 1. HNSS在SS上執行.
Case 2. HNSS在BS上執行.
目前我是偏向Case 2., 但是Case 2的話~那某個BS必須先取得,其他幾個BS對於SS的傳輸相關參數,Ex. transmission data rate, vaild symbole. 但是重點來了~BS該如何取得其餘的BS對SS這些相關參數呢??這一部份就要仔細去思考了...

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

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

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

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

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

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~

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~

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~

SS的Scheduler1--init()

現在開始將敘述ssscheduler.cc內一些比較重要的member funciton,首先是init()---

Step1. 設定MacState為MAC802_16_WAIT_DL_SYNCH,並且設定PHY的mode為OFDM_RECV.

Step2. 設定各種Timer. 設定的種類有T21 (time the station searches for DL-MAP on a channel), T1 (wait for DCD timeout), T12(wait for UCD descriptor), T2(wait for broadcast ranging timeout), lostDLMAPtimer (Timer for Lost DL-MAP interval), lostULMAPtimer (Timer for Lost UL-MAP interval).

Step3. 利用scanning _structure (reference ssscheduler.h)產生scan_info_,並且初始化其內部各值.scanning_structure包含response for BS, current scanning state, backup of normal, current iteration, timer to notify end of scanning period, number of frame before switching to scanning, ss的schdule state, current neighbor during scanning or handover, arrays of rdv timers, nb_rdv_timer, serving_bsid, number frame to wait before executing handoff.

End~~

2008年4月3日 星期四

BS的scheduler4-start_dlsubframe ()

正所謂逃的了一時~~逃不了一世XDDD,終於到關鍵的地方了"DL Subframe".呼...這一段真是不好k,一些外部的member funciton呼叫來呼叫去的,雖然有搭配文件在看,但是有時真被搞的昏頭轉向 囧,好了...廢話不多說~進入主題吧!!以下為start_dlsubframe () 的流程---

Step1. 先判斷哪些peer node很久沒有傳送packet,並與這些很久沒傳packet的peer node中斷連線.

Step2. 計算出nbPS (一個Frame內總Phy slot的數量), nbPS_left (Remain slot = nbPS - 從receving轉成transmission state所花費的slot -從transmission轉成receving state所花費的slot) , nbSymbols (在nbPS_left中, Symbol的數量,記得還要扣除INIT_DL_DURATION+DL_PREAMBLE所佔據的Symbol喔~), dlduration (INIT_DL_DURATION+DL_PREAMBLE) 以及 ulduration.

Step3. 取得outgoing connection list,再判斷此connection的peer是否沒有在scanning,若是的話則取得此connection的queue size,並且將packet傳輸時間換算成Symbol數 (tmp).若是tmp小於Symbol數,則dlduration (單位應為symbol)加上tmp, Symbol數減去tmp;反之,dlduration加上Symbol數, Symbol數減去Symbol數(此處針對dlduration加Symbol數的真正含意我不暸~要在研究研究).

Step4. 已OFDM Symbol為單位產生DL Subframe的duration以及Burst. 另外再設定Ul Subframe的start time (dlduration*每個Symbol所會佔用的PS數+receving轉成transmission state所花費的slot)以及resched的時間.

Step5. 重新取得Burst(1) (在init()中有設定Burst(1)為End_of_map)更新其Start time.並且逐一將UL Subframe的PDU刪去.

Step6. 先計算出contention slots,再判斷nbSymbols是否大於contention slots,若是大於則間接求出ranging slot, bw slot以及nbSymbols. 透過算出的數值在求得ranging duration與bw duration.接著產生一Burst,並設定其IUC為UIUC_INITIAL_RANGING, Duration為rangingduration, Start time為ulduration. 再產生一Burst, 並設定其IUC為UIUC_REQ_REGION_FULL, Duration為bwduration, Start time為ulduration. 最後會判斷是否有Fast Rangin allocation,若是有則會進行相對應的動作(此段code我沒有深入研究,就先跳過嚕~).

Step7. 判斷是否有peer node在Scanning,若是有則將其加到list中. 若是nbSymbols大於0,且peer node沒有在進行scanning,則產生Burst,並設定其IUC為UIUC_PROFILE_1, Cid, Duration為nbSymbols, Start time為ulduration. 接著取得UIUC_PROFILE_1的profile *p,若是p為Null則為它增加一profile,並設定其IUC為UIUC_PROFILE_1.最後,產生一Burst,設定其IUC為UIUC_END_OF_MAP,Start time為rangingduration+bwduration+nbSymbols.

Step8. 重頭戲要豋場了~首先依序取得先所設定的眾多Burst,在判斷所取出的burst其Index是否為0(第一個Burst),若是則會分別設定DL_MAP, UL_MAP, DCD以及UCD相關數據;首先抓出DL_MAP,設定其傳輸時間,並將傳輸時間轉為Symbols數 (txtime_s),並將此DL_MAP放至queue中,並且把duration加上txtime_s,同理於UL_MAP. 設定好DL/UL MAP後,接著設定DCD/UCD,首先抓出DCD,設定其傳輸時間,並將傳輸時間轉為Symbols數 (txtime_s),並將此DCD放至queue中,並且把duration加上txtime_s,接著把sendDCD設為false,以及重新設定DCD的時間,同理於UCD. 再來就是取出outgoing connection list的head嚕,並且會計算其數量多少.再來就是將這些connection隨機取出一個~並且判斷是否在scanning,若是的話就執行transfer_packets (c, b, duration).

Step9. 改變PHY的State為Send,並且啟動dlsubframe的hander與重新schedule下一個frame的起始時間.

接下來就要k ssscheduler.cc~看SS是如何進行運作的,以及了解一下transfer_packets (c, b, duration).

End~~

BS的scheduler3-start_ulsubframe ()

在一個Frame中主要是由兩個Subframe所組合而成,分別為DL Subframe以及UL Subframe.此篇文章先敘述UL Subframe的流程吧~以下為NS2為利用start_ulsubframe ()產生UL Subframe的流程---
Step1. 首先設定PHY layer的Mode (至於是哪些Mode我就不清楚了 :P).

Step2. 啟動UL Subframe的handler

Step3. 為下一個Frame重新排程(主要是利用一個Frame的duration time來做排程).

End~~

BS的scheduler2-process (Packet *p)

這篇文主要是敘述,當BS從MAC layer收到packet後會有何種反應.當BS從MAC收到packet後,會執行process (Packet *p),流程如下---
Step1. 首先利用傳入的packet產生wimaxHdr. 取出object wimaHdr的header,放到gen_mac_header_t header內,再判斷此header是否為bw request,若是則執行prcess_bw_req(p) (以後有空在談吧 ^^).

Step2. 取出傳入packet的accessdata. 將accessdata放入 mac802_16_dl_map_frame *frame.接著利用switch判斷此frame的type為何,若是為MAC_RNG_REQ, 則執行process_ranging_req (p); 若是為MAC_REG_REQ, 則執行process_reg_req (p); 若是為MAC_MOB_SCN_REQ, 則執行ctrlagent_->process_scan_request (p); 若是為MAC_MOB_MSHO_REQ, 則執行process_msho_req (p); 若是為MAC_MOB_HO_IND, 則執行process_ho_ind (p).

以後有機會在敘述各個process吧~~
End~~

BS的scheduler1-init()

這幾天想了解BS是如何形成frame,因此就去k了bssscheduler.cc 囧(呼...真難吃),在bsscheduler.cc中,我覺得它比較重要的有幾個部份: 1. init(), 2. process(Packet *p), 3. start_ulsubframe(), 4. star_dlsubframe(). 以下將敘述init()這個member function (若是有錯就麻煩糾正一下嚕^^)---

Step1. 首先會利用Frameduration time / PS (number fo Phy Slot)的duration time來得到PS的數量.

Step2. 產生用來broadcast的Profile,設定Interval Usage Code (IUC),以及設定Preamble的大小(單位為symbols).

Step3. 產生Burst(0)來carry broadcast message,並設定Cid為(BROADCAST_CID), IUC, Starttime, INIT_DL_DURATION, Preamble等等參數.另外產生Burst(1),也設定其IUC (DIUC_END_OF_MAP)以及其start time (INIT_DL_DURATION).

Step4. Create initial ranging. 先計算starttime, slotleft, rangingslot (slotleft/2), rangingduration, bwduration (duration的單位都是symbols),計算好後產生一個Profile,並將其IUC設為UIUC_INITIAL_RANGING, 接著為BW requset取得contention slots,並透過InitRangingopportunity得到nbPS,並將其設為contention slots的大小,再分別設定Backoff_star/stop.設定好這些參數後,實際產生Burst(0),並在Subframe第0的位置增加PDU,其IUC設為UIUC_INITIAL_RANGING,start time設為0.到此以完整產生出一uplink burst接收initial ranging request.

Step5. 產生一bw request配給相對應的burst與PDU.先產生一profile並將其IUC設為UIUC_REQ_REGION_FULL,利用getBw_req()取得BW request的contention slot,取回slot後分別設定slot的Size, Backoff_star/stop,接著產生Burst(0),並在Subframe第1的位置增加PDU,設定IUC為UIUC_REQ_REGION_FULL,以及設定相對應的Duration與Starttime.(start after the ranging slot)

Step6. 設定End of map. 產生Burst(0),並在Subframe第2的位置增加PDU,以及設定IUC為UIUC_END_OF_MAP,start time則為ranginnduration+bwduration.

Step7. Schedule the first frame by using a random & start the DCD, UCD and NBRADV timer (DCD=Downlink Channel Descriptor UCD=Uplink Channel Descriptor)

End~