網絡設備驅動
1、Linux 網絡類設備不在是基於文件操作(沒有對應的映射到文件系統中的設備節點),而是套接字socket來實現通訊
2、Linux 網絡子系統的架構圖
各層次接口功能說明:
系統調用接口層:爲應用程序提供訪問網絡子系統的統一方法。
協議無關層:提供通用的方法來使用傳輸層協議。
協議棧的實現:實現具體的網絡協議
設備無關層:協議與設備驅動之前通信的通用接口
設備驅動程序:
3、驅動程序數據結構
數據包描述結構:struct sk_buff
a) 所在頭文件:<linux/sk_buff.h>
b) sk_buff爲Linux網絡層提供高效的緩衝區處理和流量控制機制,對驅動開發來說比較關心的是sk_buff結構體中的以下數據:
struct sk_buff
{
unsigned int len, /*數據包包含的數據量*/
....
sk_buff_data_t tail; /* 用於指向數據包載荷的結束*/
sk_buff_data_t end; /* 用於指向數據包的結束*/
unsigned char *head; /* 用於指向數據包的開始*/
unsigned char *data; /* 用於指向數據包載荷的開始*/
...
}
網卡描述結構:struct net_device
1、一個網卡結構表示一個具體設備
struct net_device
{
char name[IFNAMSIZ]; /*設備接口名,如eth0 */
...
unsigned long mem_end; /* shared mem end */
unsigned long mem_start; /* shared mem start */
unsigned long base_addr; /* device I/O address */
unsigned int irq; /* device IRQ number */
...
/* Management operations */
const struct net_device_ops *netdev_ops;/*網卡設備操作集*/
const struct ethtool_ops *ethtool_ops;
}
網卡操作描述結構:struct net_device_ops
和字符設備的原理差不多
網卡使用函數
結構分配:
1、alloc_netdev(....):迴環網卡分配
2、alloc_ieee80211():WIFI無線網卡分配
3、ndev = alloc_etherdev(sizeof(struct xxx)):對1加工而已,適用於以太網卡
網卡設備註冊:
ret = register_netdev(ndev);
網卡設備註銷:
free_netdev(ndev);
4、Linux網絡設備驅動體系架構分析
設備初始化:
1、申請網絡設備:
struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
2、初始化設備dev
a.中斷號
b.I/O基地址
c.填充MAC地址(在捕獲設備中進行)
d.關聯操作函數集:dev->netdev_ops = &net_ops;(捕獲設備中進行)
3、捕獲設備:初始化硬件(或者在open 函數中進行)
4、向內核註冊網卡驅動:retval = register_netdev(dev);
網卡發送函數:.ndo_start_xmit = net_send_packet,
1、 通知上層協議停止發送數據:netif_stop_queue(dev);
2、 將skb的數據寫入發送寄存器中
3、 釋放skb空間:dev_kfree_skb (skb);
4、 在發送中斷處理函數中(網卡有多種類型中斷:接收數據包可產生 中斷,發送數據包也可以產生中斷)通知上層協議可以再次向網卡 傳輸數據 netif_wake_queue(dev);-->喚醒發送隊列
網卡接收(在中斷中進行):net_rx(struct net_device *dev)
1、讀取接收狀態
2、讀取接收數據長度
3、分配SKB結構:skb = dev_alloc_skb(length + 2); /*構造新數據包*/
4、從網卡寄存器中讀取數據填入SKB結構
5、使用netif_rx(skb);將skb 數據包發送給上層協議去處理