LDD3學習筆記(20) 網路驅動

2021-08-26 00:03:30 字數 3677 閱讀 1556

#include

定義structnet_device和structnet_device_stats的標頭檔案,包含了幾個其他網路驅動需要的頭

檔案.

structnet_device*alloc_netdev(intsizeof_priv,char*name,void(*setup)(structnet_device*);

structnet_device*alloc_etherdev(intsizeof_priv);

voidfree_netdev(structnet_device*dev);

分配和釋放net_device結構的函式

intregister_netdev(structnet_device*dev);

voidunregister_netdev(structnet_device*dev);

註冊和登出乙個網路裝置.

void*netdev_priv(structnet_device*dev);

獲取網路裝置結構的驅動私有區域的指標的函式.

structnet_device_stats;

持有裝置統計的結構.

netif_start_queue(structnet_device*dev);

netif_stop_queue(structnet_device*dev);

netif_wake_queue(structnet_device*dev);

控制傳送給驅動來傳送的報文的函式.沒有報文被傳送,直到netif_start_queue被呼叫.

netif_stop_queue掛起傳送,netif_wake_queue重啟佇列並刺探網路層重啟傳送報文.

skb_shinfo(structsk_buff*skb);

巨集定義,提供對報文快取的"sharedinfo"部分的訪問.

voidnetif_rx(structsk_buff*skb);

呼叫來通知核心乙個報文已經收到並且封裝到乙個socket快取中的函式.

voidnetif_rx_schedule(dev);

來告訴核心報文可用並且應當啟動查詢介面;它只是被napi相容的驅動使用.

intnetif_receive_skb(structsk_buff*skb);

voidnetif_rx_complete(structnet_device*dev);

應當只被napi相容的驅動使用.netif_receive_skb是對於netif_rx的napi對等函式;它遞交乙個報文給核心.當乙個napi相容的驅動已耗盡接收報文的**,它應當重開中斷,並且呼叫netif_rx_complete來停止查詢.

#include

由netdevice.h包含,這個檔案宣告介面標誌(iff_巨集定義)和structifmap,它在網路驅動的ioctl實現中有重要地位.

voidnetif_carrier_off(structnet_device*dev);

voidnetif_carrier_on(structnet_device*dev);

intnetif_carrier_ok(structnet_device*dev);

前2個函式可用來告知核心是否介面上有載波訊號.netif_carrier_ok測試載波狀態,如同在裝置結構中反映的.

#include

eth_alen

eth_p_ip

structethhdr;

由netdevice.h包含,if_ether.h定義所有的eth_巨集定義,用來代表位元組長度(例如位址長度)以及網路協議(例如ip).它也定義ethhdr結構.

#include

structsk_buff和相關結構的定義,以及幾個操作快取的內聯函式.這個標頭檔案由netdevice.h包含.

structsk_buff*alloc_skb(unsignedintlen,intpriority);

structsk_buff*dev_alloc_skb(unsignedintlen);

voidkfree_skb(structsk_buff*skb);

voiddev_kfree_skb(structsk_buff*skb);

voiddev_kfree_skb_irq(structsk_buff*skb);

voiddev_kfree_skb_any(structsk_buff*skb);

處理socket快取的分配和釋放的函式.通常驅動應當使用dev_變體,其意圖就是此目的.

unsignedchar*skb_put(structsk_buff*skb,intlen);

unsignedchar*__skb_put(structsk_buff*skb,intlen);

unsignedchar*skb_push(structsk_buff*skb,intlen);

unsignedchar*__skb_push(structsk_buff*skb,intlen);

新增資料到乙個skb的函式;skb_put在skb的尾部放置資料,而skb_push放在開始.正常版本進行檢查以確保有足夠的空間;雙下劃線版本不進行檢查.

intskb_headroom(structsk_buff*skb);

intskb_tailroom(structsk_buff*skb);

voidskb_reserve(structsk_buff*skb,intlen);

進行skb中的空間管理的函式.skb_headroom和skb_tailroom說明在開始和結尾分別有多少空間可用.skb_reserve可用來保留空間,在乙個必須為空的skb開始.

unsignedchar*skb_pull(structsk_buff*skb,intlen);

skb_pull"去除"資料從乙個skb,通過調整內部指標.

intskb_is_nonlinear(structsk_buff*skb);

如果這個skb是為發散/匯聚i/o分隔為幾個片,函式返回乙個真值.

intskb_headlen(structsk_buff*skb);

返回skb的第乙個片的長度,由skb->data指向.

void*kmap_skb_frag(skb_frag_t*frag);

voidkunmap_skb_frag(void*vaddr);

提供對非線性skb中的片直接訪問的函式.

#include

voidether_setup(structnet_device*dev);

為乙太網驅動設定大部分方法為通用實現的函式.它還設定dev->flags和安排下乙個可用的

ethx給dev->name,如果名子的第乙個字元是乙個空格或者null字元.

unsignedshorteth_type_trans(structsk_buff*skb,structnet_device*dev);

當乙個乙太網介面收到乙個報文,這個函式被呼叫來設定skb->pkt_type.返回值是乙個協議號,通常儲存於skb->protocol.

#include

siocdevprivate

前16個ioctl命令,每個驅動可為它們自己的私有用途而實現.所有的網路ioctl命令都在sockios.h中定義.

#include

structmii_if_info;

宣告和乙個結構,支援實現mii標準的裝置的驅動.

#include

structethtool_ops;

宣告和結構,使得裝置與ethtool工具一起工作.

LDD3學習筆記(9) 高階字元驅動操作

1 ioctl介面 ioctl驅動方法有和使用者空間版本不同的原型 int ioctl structinode inode,structfile filp,unsignedintcmd,unsignedlongarg 2 阻塞i o 阻塞程序,使它進入睡眠直到請求可繼續。當乙個程序被置為睡眠,它被標...

LDD3學習筆記(11) 記憶體分配

kmalloc分配記憶體快並且不清零獲得的記憶體區,記憶體區保留它原來的內容,分配的區在物理記憶體中連續。include void kmalloc size t size,int flags void kfree void obj 記憶體分配的最常用介面.include gfp user gfp k...

LDD3學習筆記 模組的編譯

新手上路,ldd3學習之旅開始,以下內容純屬筆記,若有錯誤,望見諒!1.什麼是 模組 可以在系統執行時加入到核心中的 故 模組包括但不限於裝置驅動程式。2.如何寫乙個模組?1 c檔案 2 實現module init,module exit3.ldd3中makefile編寫規則 照搬 ifneq ke...