5. MAC 模組模組之開發設計與實作
5.2 MAC 模組之設計
5.2.1 MAC Kernel Module
5.2.1.3 Rx Protocol
若有訊框經由GPIO 傳入,MAC 執行緒會將此訊框交給 Rx Protocol 處理。Rx Protocol 將判斷此訊框為何種訊框,若為RTS 訊框,將回傳相對應的 CTS 訊框;若為 Data 訊框,
將回傳相對應的ACK 訊框。接收封包之程式流程如圖 5-5 所示。
傳送CTS 訊框時,與 Tx Protocol 相同,傳送訊框時必須先偵測傳輸媒介是否為空閒。
若為空閒,則傳送訊框;但若並非空閒,將不會有任何動作。與傳輸CTS 訊框不同,傳送 ACK 訊框時,不需要偵測傳輸媒介是否為空閒,就算傳輸媒介為忙碌,ACK 訊框也可以 傳送。自下層之基頻模組接收到 Data 訊框後,Rx_portocol 程式會將 Data 訊框交由程式 Send_message 處理。
圖5-4 傳送封包之程式流程圖
Medium Idle ?
Transmit CTS frame 開始
RTS frame ?
結束
Data frame ?
Transmit ACK frame
No Send_message。Packet_in 負責處理接收之 IP 封包,會透過 Linux 核心的防火牆 module
「Netfilter」將 IP 封包接收至 MAC Kernel Module;Send_message 會透過 Linux 核心程式的 sendmsg 指令傳送 IP 封包。
Netfilter 屬於 Linux 核心底層的工作,為 Linux 核心的防火牆 module。Netfilter 在 IPv4 protocol 中有五個 hook point(檢查點),分別為 NF_IP_PRE_ROUTING、NF_IP_LOCAL_IN、
NF_IP_FORWARD、NF_IP_LOCAL_OUT、與 NF_IP_POST_ROUTING。如圖 5-6 所示,IP 封包從網路線傳入後,會先經過Netfilter 架構的 NF_IP_PRE_ROUTING,接著進入 Route,
此時決定此IP 封包要進入 Linux 核心或者該傳送到另一個介面。若 Route 不知道此 IP 封包 該傳往哪個介面,Route 可將此 IP 封包丟棄。傳送至 Linux 核心的 IP 封包,會先經過 Netfilter 架構的NF_IP_LOCAL_IN 再傳入 Linux 核心。傳送至另一個介面的 IP 封包,在被丟回網 路線之前,會先經過Netfilter 架構的 NF_IP_FORWARD。所有傳入網路線的 IP 封包,會先 經過 Netfilter 架構的 NF_IP_POST_ROUTING。由 Linux 核心傳出的 IP 封包,會先經過 Netfilter 架構的 NF_IP_LOCAL_OUT,再由 Route 決定 IP 封包傳輸方向。
任何Kernel Module 都可以與 Netfilter 架構的 hook point 註冊,之後便可監聽所註冊的 hook point,當 hook point 有封包時,在 Kernel Module 中與 hook point 註冊的程式會被呼叫。
PRE_ROUTING Route FORWARD
Local Process Local Process
圖5-6 IP 封包穿越 Netfilter 系統示意圖
MAC Kernel Module 被載入 ARM 子板所掛載的 Embedded Linux 作業系統運行,在初 始的過程中,MAC Kernel Module 將與系統的 Netfilter 連結住。MAC Kernel Module 初始一 個資料結構input filter,在 input filter 掛上 input_handler 程式,並設定 hook point 為 Netfilter 的 NF_IP_PRE_ROUTING。接著利用函式 nf_register_hook(&input_filter)向系統註冊 input filter,完成了 MAC Kernel Module 與系統的 Netfilter 的連結。完成連結後,若 Netfilter 偵 測到任何的IP 封包輸入,會將所攔截到的 IP 封包交給 input_handler 程式處理。
由 Netfilter 偵測到由網路線輸入至本媒體存取控制模組的封包,將交由 input_handler 處理,input_handler 會呼叫 packet_in 程式。packet_in 程式先檢查此 IP 封包的來源。若為 本模組所發送出去的封包,則將此IP 封包丟棄;若並非本模組所發送出去的封包,會將此 IP 封包接收做處理,將 IP 封包由資料結構轉成適合 MAC 層協定封包處理的 bit stream 形 式後,會喚醒MAC 執行緒執行相關傳送封包的工作。
自下層之基頻模組接收到 Data 訊框後,Rx_portocol 程式會將 Data 訊框交由程式 Send_message 處理。Send_message 程式將訊框中 header 去除,留下 data 部分,從 data 部 分解讀出IPv4 address、IP 封包長度…等組成 IP 封包資料結構的參數後,再利用 Linux 核 心程式中sendmsg 指令,將接收封包由網路線送至上層之 Ad-Hoc 隨意網路繞徑模組。
5.2.1.5 Linux 程式運作空間之間的介面程式 (Proc File System)
一般Linux 作業系統會把程式的運作空間分開。作業系統的程式,例如驅動程式、Kernel Module….等,在 Kernel Space(核心空間)運作;一般使用者撰寫的程式在 User Space(使用 者空間)中運作。各自有不同的記憶體空間,彼此間不會互相干擾。
如果User Space 中運行的程式要與 Kernel Module 傳遞資料,即 User Space 中運行的程 式要讀取或寫入 Kernel Space 的資料,用一般的指標或者 memory copy 無法達成。因為 Kernel Module 所在的 Kernel Space 與 User Space 的記憶體空間不同,指標只能在目前的位 址空間內運作。若必須在Kernel Space 與 User Space 間資料傳遞,則必須依靠特殊的函式。
本模組採用Proc File System 負責在兩個不同 Space 間資料傳遞。Proc File System 為一種虛 擬的File System,任何 Kernel Space 中的元件要與 User Space 溝通,可在 Linux 作業系統 的File System 下的 Proc 資料夾底下建立檔案,User Space 的程式透過讀寫這個檔案就可以 與Kernel Space 溝通。
MAC Kernel Module 載入後,會在 ARM 子板上掛載之 Embedded Linux 的 File System 下的Proc 資料夾底下建立一個資料夾,稱為 My_MAC,接著再此資料夾下建立五個檔案,
分別為packet、en_packet、frame、en_frame、和 carrier_sense。當位於 Kernel Space 的 MAC Kernel Module 有訊框需要傳送時,會將要傳送之訊框放在檔案 packet 中;並且將檔案 en_packet 填入”1”,用來通知 User Space 中的程式 GPIO Controller 讀取需傳送之訊框,並 且透過GPIO 傳送至 FPGA 子板上的 FIFO 電路暫存,等待傳送至下層之基頻模組。同樣的,
若User Space 中的程式 GPIO Controller 自 FPGA 子板上的 FIFO 電路接收到來自下層之基 頻模組發送的訊框,GPIO Controller 會將接收之訊框寫入檔案 frame,並且將檔案 en_frame 寫入”1”,用來通知 Kernel Space 的 MAC Kernel Module 處理接收到的訊框。GPIO Controller 也會將下層之基頻模組發送的控制訊號Carrier Sense 寫入檔案 carrier_sense,Kernel Space 的MAC Kernel Module 將會利用此檔案的值判斷傳輸媒介是否為空閒。如圖 5-7 所示,位 於Kernel Space 的 MAC Kernel Module 與 User Space 中的程式 GPIO Controller 透過 Proc file 傳輸資料。
圖5-7 Proc file 5.2.2 GPIO Controller
此程式主要工作為負責將MAC Kernel Module 需要傳輸的訊框,透過 GPIO 腳位傳入 FPGA 子板的 FIFO 電路中, 讓下層之基頻模組做存取。另一方面,當基頻模組傳送訊框 至FPGA 子板的 FIFO 後,GPIO Controller 程式透過 GPIO 腳位讀取 FIFO 電路中之訊框,
並且將訊框傳遞給MAC Kernel Module 處理。ARM 子板與 FPGA 子板的 GPIO 腳位規劃如 圖5-8 所示。
圖5-8 ARM 子板與 FPGA 子板的 GPIO 腳位規劃圖
當GPIO Controller 啟動後,先設定每根 GPIO 腳位為輸入腳位或為輸出腳位。接著隨 時偵測Carrier Sense 腳位,此為一控制訊號,下層之基頻模組透過此根腳位告知媒體存取 控制模組目前傳輸媒介的情況,為空閒或是忙碌。接著,GPIO Controller 偵測 Data_in_FIFO 腳位,利用此根腳位為”0”或”1”,得知 FPGA 子板中接收端 FIFO 中是否收到由下層之基頻 模組傳來的訊框,若有訊框暫存於FIFO 中,GPIO Controller 利用 En_Rx 及 Rx_CLK 兩根 腳位控制接收端的FIFO,FIFO 將透過 Rx_data 將存於 FIFO 中的訊框資料傳入 ARM 子板。
當GPIO Controller 接收到訊框資料後,利用 Proc File 將訊框傳遞給 MAC Kernel Module。
GPIO Controller 由 Proc File 之 En_Packet 得知 MAC Kernel Module 有訊框需要輸出,便透 過Proc File 之 Packet 取得須輸出之訊框,利用 En_Tx 及 Tx_CLK 兩根腳位控制 FPGA 子板 上的接收端 FIFO,將透過 Tx_data 將訊框存於 FIFO 中讓下層之基頻模組做存取。GPIO Controller 運作流程如圖 5-9 所示。
圖5-9 GPIO Controller 運作流程圖 5.2.3 MAC 與基頻模組的介面電路設計
本論文將使用 FPGA 來實現 MAC 模組與基頻模組間之介面電路。MAC 模組與基頻模 組間的介面腳位規劃如圖5-10 所示。其中 Carrier_Sense 腳位直接連接到媒體存取控制模組 的ARM 子板,其他腳位都與媒體存取控制模組的 FPGA 子板連接。在 FPGA 子板上有兩 個FIFO,分別負責傳送與接收訊框,因為與 ARM 子板是以 Byte 形式傳輸資料,與下層之 基頻模組是以 Bit 形式傳輸資料,因此在 FPGA 子板上還設計了一些控制電路處理傳輸的 資料形式不同的問題。MAC 模組與基頻模組間的介面腳位功能說明如下:
Tx_CLK 與 Rx_CLK:資料傳輸之時脈。
En_tx:MAC 模組傳送訊框觸發腳位。
Tx_data:MAC 模組傳送訊框之資料腳位。
En_rx:基頻模組傳送訊框給 MAC 模組之觸發腳位,MAC 模組被觸發後開始接收訊框。
Rx_data:MAC 模組接收訊框之資料腳位。
圖5-10 媒體存取控制模組與基頻模組的腳位規劃圖
5.3. MAC 模組之功能測試
媒體存取控制模組的功能測試主要分成兩項:RTS/CTS 機制和 CSMA/CA 機制的測 試。RTS/CTS 機制的測試主要目的在於測試訊框交換的程序是否能順利進行。CSMA/CA 機制的測試則包含Carrier Sense 腳位是否正常工作、退後程序的進行、重新傳送的限制次 數…等。
5.3.1 RTS/CTS 機制之測試
RTS / CTS 機制的測試環境示意圖如圖 5-11 所示。使用兩組媒體存取控制模組,假設 其名稱分別為工作站A 與工作站 B。以兩台 Windows 電腦主機分別與兩組模組相連接,使 用 Windows 作業系統下的應用程式-超級終端機當作媒體存取控制模組的顯示終端機。另 外,使用一台Linux 電腦主機與工作站 A 相連接,此台 Linux 主機的功用在於發送測試 IP 封包給工作站A。工作站 A 擷取到 IP 封包後,開始進行 RTS / CTS 機制,將 IP 封包傳送 給工作站B。另外,使用訊號產生器產生時脈給兩塊 MAC 模組,作為模組間資料傳輸的同 步使用,實際測試環境場景圖如圖5-12 所示。
圖5-11 測試環境示意圖
圖5-12 實際測試環境場景圖
(順時鐘依序為工作站 A 之顯示終端機、Linux 主機、工作站 B 之顯示終端機、訊號產生器、
工作站B、工作站 A)
當兩組媒體存取控制模組啟動完成後,在Linux 主機底下,下達 ping 指令發送 ping 封 包,我們將此封包當測試用的IP 封包。圖 5-13 與圖 5-14 分別為工作站 A 和工作站 B 的顯 示終端機的顯示結果。工作站A 攔截到測試 IP 封包,並將封包封裝成 data 訊框,如圖 5-13 的標記A 處所示。工作站 A 開始 RTS / CTS 機制,工作站 A 傳送 RTS 訊框,以告知工作 站B 有資料要傳送,接著等待 CTS 訊框的回傳,如圖 5-13 的標記 B 處所示。工作站 B 接 收到RTS 訊框後,回傳 CTS 訊框,表示允許傳送資料,如圖 5-14 標記 A 處所示。工作站 A 接收到 CTS 訊框後,如圖 5-13 標記 C 處所示,便開始傳送 data 訊框,接著等待 ACK 訊 框的回傳,如圖5-13 標記 D 處所示。工作站 B 接收到 data 訊框後,回傳 ACK 訊框,告知 確認完成資料傳送,如圖 5-14 標記 B 處所示。工作站 B 所接收到的 data 訊框內容,如圖
當兩組媒體存取控制模組啟動完成後,在Linux 主機底下,下達 ping 指令發送 ping 封 包,我們將此封包當測試用的IP 封包。圖 5-13 與圖 5-14 分別為工作站 A 和工作站 B 的顯 示終端機的顯示結果。工作站A 攔截到測試 IP 封包,並將封包封裝成 data 訊框,如圖 5-13 的標記A 處所示。工作站 A 開始 RTS / CTS 機制,工作站 A 傳送 RTS 訊框,以告知工作 站B 有資料要傳送,接著等待 CTS 訊框的回傳,如圖 5-13 的標記 B 處所示。工作站 B 接 收到RTS 訊框後,回傳 CTS 訊框,表示允許傳送資料,如圖 5-14 標記 A 處所示。工作站 A 接收到 CTS 訊框後,如圖 5-13 標記 C 處所示,便開始傳送 data 訊框,接著等待 ACK 訊 框的回傳,如圖5-13 標記 D 處所示。工作站 B 接收到 data 訊框後,回傳 ACK 訊框,告知 確認完成資料傳送,如圖 5-14 標記 B 處所示。工作站 B 所接收到的 data 訊框內容,如圖