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

沒有留言: