查看單個文章
舊 2006-05-30, 01:26 PM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 Linux 無線網路技術: WLAN

當今,不考慮 Linux 和無線網路技術的話,就無法談到電腦和網路。在這篇文章中,Sreekrishnan Venkateswaran 用 Linux 觀點闡釋了通過 WLAN、Bluetooth、GPRS、GSM 以及 IrDA 實現無線聯網。他使用各種不同的無線設備和相應的內核層,以及用戶空間工具來示範它們在 Linux 下如何工作。

  無線技術,例如 WLAN (Wireless Local Area Network)、Bluetooth、GPRS (General Packet Radio Service)、GSM (Global System for Mobile communications) 以及 IrDa (Infrared Data),在不同的環境下提供服務。雖然 WLAN 支持比 Bluetooth 更高的速度和更長的傳播距離,但是它也需要更多的費用並且耗電量更大。GPRS 雖然比 Bluetooth 和 WLAN 慢,但是可用於移動技術。儘管它們存在差異,或者是其他原因,但是具有多種無線功能的設備可以綜合利用它們。例如,根據 GPS 模塊的定位輸入,設備可以透明地將網路連接從路上的 GPRS 切換到網吧中更便宜的 WLAN。移動電話可以通過 Bluetooth 與心律監視器通信,當病人心律超出某個極限時,就可以通過 GSM 向醫生發送警報。

  目前,無線技術已經以 PCMCIA、Compact Flash (CF) 卡的形式廣泛應用,或者用於 USB 設備。大多數電腦系統,包括嵌入式設備,都有 PCMCIA、CF 或者 USB 接頭,即使不含對無線技術的內置支持,也能夠立刻使用這些技術。這篇文章分析了無線設備的一些示例,並且研究了設備驅動程式的 Linux 實現、總線技術以及各種協議。

  首先,通過跟蹤 WLAN 樣卡的代碼流,您將瞭解到 WLAN 設備是如何在 Linux 下工作的,然後還可以看到幾個 Bluetooth 設備如何與 Linux Bluetooth 棧和其他內核層連接。接下來,您將瞭解到如何使 GPRS 和 GSM 設備在 Linux 下工作。文章最後分析了 Linux 上的 IrDa 支持並簡要介紹了有關無線網路設備的性能問題。

  注意:本文涉及到的內核資料結構和文件名是當前 Linux 版本中所使用的。文件名相對於 Linux 內核源程式樹的根。

  Linux 802.11 WLAN

  WLAN 通信系統作為有線 LAN 以外的另一種選擇一般用在同一座建築內。WLAN 使用 ISM (Industrial、Scientific、Medical) 無線電廣播頻段通信。WLAN 的 802.11a 標準使用 5 GHz 頻段,支持的最大速度為 54 Mbps,而 802.11b 和 802.11g 標準使用 2.4 GHz 頻段,分別支持最大 11 Mbps 和 54 Mbps 的速度。

  WLAN 類似於有線以太網,它們都是從同一地址池分配 MAC (Media Access Control) 地址,並且都是作為以太網設備出現在操作系統的網路設備層。例如,ARP(Address Resolution Protocol) 表是用 WLAN MAC 地址和以太網 MAC 地址填充的。

  然而 WLAN 與有線以太網在鏈路層有很大的區別。例如,802.11 標準使用衝突避免(CSMA/CA)代替有線以太網的衝突檢測(CSMA/CD)。而且,與以太網幀不同的是,WLAN 幀是被確認的。
由於 WLAN 工作站之間的模糊邊界,WLAN 鏈路層擁有在傳送前清除一個區域的協議。出於安全性考慮,WLAN 的 Wired Equivalent Privacy (WEP) 加密機制提供與有線網路相同的安全級別。WEP 將 40 比特或 104 比特密鑰與隨機的 24 比特初始向量組合用以加解密資料。WLAN 支持兩種通信模式:Ad Hoc 模式 用於小群組工作站之間不必使用訪問點的短時間內通信,而 Infrastructure 模式 的所有通信必須通過訪問點。訪問點週期性地廣播一個服務集標識符(SSID),SSID 用於將一個 WLAN 網路與其他網路區別開來。

  大多數可用的 WLAN 卡是基於 Intersil Prism 或 Lucent Hermes 芯片組的。Compaq、Nokia、Linksys 和 D-Link 卡使用 Prism 芯片組,而 Lucent Orinoco 卡和 Apple Airport 使用 Hermes 芯片組。

  Linux WLAN 支持

  Linux WLAN 支持由 WLAN API 實現和 WLAN 設備驅動程式組成。我將依次研究它們。

  有兩個 Linux 專案定義一般的 WLAN API,並且提供工具讓用戶空間應用程式配置參數和存取來自 WLAN 設備驅動程式的訊息。Wireless Extensions 專案為不同的無線網卡提供公共的 Linux 用戶空間接頭。這個專案的工具包括 iwconfig 用以配置參數(比如 WLAN 驅動程式中的 WEP 關鍵字及 SSID)。linux-wlan 專案作為 Wireless Extensions 專案一部分,也支持一系列用於從用戶空間與 WLAN 設備驅動程式交互的工具。與基於 Wireless Extensions 的工具不同,這些工具使用類似於 SNMP (Simple Network Management Protocol) MIB (Management Information Base) 的語法,該語法反映 IEEE 802.11 規範。

  繼續討論設備驅動程式,支持流行的 WLAN 卡的 Linux 設備驅動程式包括:

  Orinoco WLAN 驅動程式:是 Linux 內核源代碼的一部分,支持基於 Hermes 的卡和基於 Intersil Prism 的卡。orinoco_cs 模塊提供了 PCMCIA 和 CF 卡所必需的 PCMCIA 卡服務支持。
  linux-wlan 專案的 linux-wlan-ng 驅動程式:支持多種基於 Prism 芯片組的卡。這個驅動程式支持 linux-wlan API 並部分支持 Wireless Extensions。
  Host AP 設備驅動程式:支持 Prism 芯片組的 AP 模式,可以使 WLAN 主機起訪問點的作用。
  Linux Symbol Spectrum 設備驅動程式:支持 Symbol PCMCIA 卡。不同於 PCMCIA 卡,Symbol CF 卡缺乏板載固件,它依靠設備驅動程式來下載固件。該驅動程式的一個單獨版本適用於 CF 卡。Intel 將 Symbol PCMCIA 卡重新壓縮打包為 Intel PRO/Wireless 卡,而 Socket 通信重新壓縮打包了 Symbol CF 卡。
  Atmel USB WLAN 驅動程式:利用 Atmel 芯片組支持許多 USB WLAN 設備。

  Intersil Prism2 WLAN CF 卡

  我將討論 Intersil Prism2 802.11b WLAN CF 卡來展示它如何與 Linux PCMCIA、網路設備及協議層一起工作。

  Linux PCMCIA/CF 層由 PCMCIA 主機控制器的設備驅動程式、不同卡的客戶機驅動程式、用戶模式程式、有助於熱拔的後台工作行程和與以上各部分交互並為它們提供服務的內核卡服務中樞組成。PCMCIA 控制器將卡連接到系統總線,將卡記憶體映射到主機 I/O 和記憶體視窗,並將卡產生的中斷路由到自由處理器中斷線。CF 卡較小,但與 PCMCIA 相容,並且經常應用於手持設備。PCMCIA/CF 卡擁有兩個存儲空間:內容記憶體(attribute memory)和 公共記憶體(common memory)。內容記憶體類似於 Card Information Structure (CIS),用來儲存配置註冊和描述符訊息。Linux 卡服務核心與主機控制器設備驅動程式、卡設備驅動程式及用戶模式 cardmgr 後台工作行程交互。它在一些事件(比如卡插入、卡移出以及低電量)發生時調用卡驅動程式的事件處理程式例程。儘管卡服務從卡的 CIS 向上傳送訊息到 cardmgr,但是 cardmgr 將為分配記憶體視窗和中斷級別而在用戶空間(/etc/pcmcia/config.opts)中定義的資源分配策略向下傳送到卡服務。檢視 drivers/pcmcia/ds.c 可以瞭解與 cardmgr 交互的內核代碼,查閱 /etc/pcmcia/config.opts 可以瞭解用戶空間資源分配策略。

  插入 Intersil WLAN CF 卡時,卡服務調用 orinoco_cs 模塊的 PCMCIA 事件處理程式。卡服務解析卡內容記憶體中的 CIS 元組(tuples)並向上傳送訊息到 cardmgr,這將從 /etc/pcmcia/config 文件(參閱清單 1)載入適當的設備驅動程式。由於卡的 CIS 中的 manfid 元組匹配 /etc/pcmcia/config 中的條目,所以 cardmgr 綁定帶有 orinoco_cs 驅動程式的卡。清單 1 中的設備條目規定 orinoco_cs 驅動程式由三個內核模塊組成:orinoco、orinoco_cs 和 hermes。此外,由於設備屬於無線的(wireless)一類,所以當啟動和停止設備時,cardmgr 執行腳本 /etc/wireless/wireless。這個腳本使用 WLAN 工具和實用程式來配置設備驅動程式參數,例如 WEP 關鍵字和 SSID。它還可以啟動 WLAN 上的網路協議,例如 DHCP(Dynamic Host Configuration Protocol,動態主機配置通訊協議)。清單 1 中的示例使用 Wireless Extensions 工具來執行設備配置。
注意: PCMCIA 配置文件的確切位置取決於所用的 Linux 分佈。

  清單 1. Intersil WLAN CF 卡的 PCMCIA 設備條目

    card "Intersil PRISM2 11 Mbps Wireless Adapter"
    manfid 0x0156, 0x0002
    bind "orinoco_cs"

    device "orinoco_cs"
    class "wireless" module "orinoco","orinoco_cs","hermes"


  用 /etc/pcmcia/wireless 和 /etc/pcmcia/wireless.opts 腳本來配置 WEP 關鍵字和 SSID 這樣的參數。

  清單 2. 配置 WLAN 特定參數

  iwconfig ethX essid <wlan_name>
  key AAAA-AAAA-AA [1] key BBBB-BBBB-BB [2] key CCCC-CCCC-CC [3] key DDDD-DDDD-DD [4]
   : Set 64-bit WEP Keys and ESSID in the driver
  iwconfig ethX : Display WLAN parameters
  iwpriv : Get nongeneric, driver-specific parameters
  iwlist : List Information and statistics from an interface
  iwspy : Read quality of link for a set of addresses
  /proc/net/wireless : Wireless Statistics from the device driver


  在插入卡時,orinoco_cs 像傳統的網路設備驅動程式一樣,調用 register_netdev 來獲得分配給 WLAN 接頭的 ethX 網路接頭名。它還會註冊一個中斷服務例程的地址以服務收發無線資料時產生的中斷。中斷處理程式是 orinoco 模塊的一部分,並與 Linux 網路棧交互。Linux 網路棧使用主要的資料結構是 sk_buff 結構(定義在 include/linux/skbuff.h 中,該文件包括關於附加在它上的一個記憶體塊的控制訊息)。sk_buffs 為所有網路層提供有效的緩衝器處理和流控制機制。網路設備驅動程式執行一個 dev_alloc_skb 和一個 skb_put,以用 IP 資料填充一個 sk_buff,然後通過調用 netif_rx 將這個sk_buff 傳送到 TCP/IP 棧。orinoco 中斷服務例程用從 WLAN 接收的資料填充 sk_buffs,並經由 netif_rx 將它傳送到 IP 棧。

  Linux TCP/IP 應用程式可以在前面談到的內核模塊為 Intersil WLAN CF 卡提供的網路接頭上不加更改地執行。

  關於作者
  Sreekrishnan Venkateswaran 擁有印度坎普爾市印度科技學院的電腦科學碩士學位。他從 1996 年 2 月開始為 IBM India 工作。 他的興趣包括設計設備驅動程式和網路協議。

此帖於 2006-06-04 11:31 AM 被 psac 編輯.
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次