Linux驅動開發-15、網絡設備驅動

網絡設備驅動

1、Linux 網絡類設備不在是基於文件操作(沒有對應的映射到文件系統中的設備節點),而是套接字socket來實現通訊

2、Linux 網絡子系統的架構圖

 

各層次接口功能說明:

系統調用接口層:爲應用程序提供訪問網絡子系統的統一方法。
協議無關層:提供通用的方法來使用傳輸層協議。
協議棧的實現:實現具體的網絡協議
設備無關層:協議與設備驅動之前通信的通用接口
設備驅動程序:

 

3、驅動程序數據結構

數據包描述結構:struct sk_buff

a) 所在頭文件:<linux/sk_buff.h>

b) sk_buffLinux網絡層提供高效的緩衝區處理和流量控制機制,對驅動開發來說比較關心的是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 數據包發送給上層協議去處理

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章