#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...