W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
本節(jié)提供了本章中介紹的概念的參考. 也解釋了每個驅(qū)動需要包含的頭文件的角色. 在 net_device 和 sk_buff 結(jié)構(gòu)中成員的列表, 但是, 這里沒有重復(fù).
#include <linux/netdevice.h>
定義 struct net_device 和 struct net_device_stats 的頭文件, 包含了幾個其他網(wǎng)絡(luò)驅(qū)動需要的頭文件.
struct net_device *alloc_netdev(int sizeof_priv, char *name, void (*setup)(struct net_device *);
struct net_device *alloc_etherdev(int sizeof_priv);
void free_netdev(struct net_device *dev);
分配和釋放 net_device 結(jié)構(gòu)的函數(shù)
int register_netdev(struct net_device *dev);
void unregister_netdev(struct net_device *dev);
注冊和注銷一個網(wǎng)絡(luò)設(shè)備.
void *netdev_priv(struct net_device *dev);
獲取網(wǎng)絡(luò)設(shè)備結(jié)構(gòu)的驅(qū)動私有區(qū)域的指針的函數(shù).
struct net_device_stats;
持有設(shè)備統(tǒng)計的結(jié)構(gòu).
netif_start_queue(struct net_device *dev);
netif_stop_queue(struct net_device *dev);
netif_wake_queue(struct net_device *dev);
控制傳送給驅(qū)動來發(fā)送的報文的函數(shù). 沒有報文被傳送, 直到 netif_start_queue 被調(diào)用. netif_stop_queue 掛起發(fā)送, netif_wake_queue 重啟隊列并刺探網(wǎng)絡(luò)層重啟發(fā)送報文.
skb_shinfo(struct sk_buff *skb);
宏定義, 提供對報文緩存的"shared info"部分的存取.
void netif_rx(struct sk_buff *skb);
調(diào)用來通知內(nèi)核一個報文已經(jīng)收到并且封裝到一個 socket 緩存中的函數(shù).
void netif_rx_schedule(dev);
來告訴內(nèi)核報文可用并且應(yīng)當(dāng)啟動查詢接口; 它只是被 NAPI 兼容的驅(qū)動使用.
int netif_receive_skb(struct sk_buff *skb);
void netif_rx_complete(struct net_device *dev);
應(yīng)當(dāng)只被 NAPI 兼容的驅(qū)動使用. netif_receive_skb 是對于 netif_rx 的 NAPI 對等函數(shù); 它遞交一個報文給內(nèi)核. 當(dāng)一個 NAPI 兼容的驅(qū)動已耗盡接收報文的供應(yīng), 它應(yīng)當(dāng)重開中斷, 并且調(diào)用 netif_rx_complete 來停止查詢.
#include <linux/if.h>
由 netdevice.h 包含, 這個文件聲明接口標(biāo)志( IFF_ 宏定義 )和 struct ifmap, 它在網(wǎng)絡(luò)驅(qū)動的 ioctl 實現(xiàn)中有重要地位.
void netif_carrier_off(struct net_device *dev);
void netif_carrier_on(struct net_device *dev);
int netif_carrier_ok(struct net_device *dev);
前 2 個函數(shù)可用來告知內(nèi)核是否接口上有載波信號. netif_carrier_ok 測試載波狀態(tài), 如同在設(shè)備結(jié)構(gòu)中反映的.
#include <linux/if_ether.h>
ETH_ALENETH_P_IPstruct ethhdr;
由 netdevice.h 包含, ifether.h 定義所有的 ETH 宏定義, 用來代表字節(jié)長度( 例如地址長度 )以及網(wǎng)絡(luò)協(xié)議(例如 IP). 它也定義 ethhdr 結(jié)構(gòu).
#include <linux/skbuff.h>
struct sk_buff 和相關(guān)結(jié)構(gòu)的定義, 以及幾個操作緩存的內(nèi)聯(lián)函數(shù). 這個頭文件由 netdevice.h 包含.
struct sk_buff *alloc_skb(unsigned int len, int priority);
struct sk_buff *dev_alloc_skb(unsigned int len);
void kfree_skb(struct sk_buff *skb);
void dev_kfree_skb(struct sk_buff *skb);
void dev_kfree_skb_irq(struct sk_buff *skb);
void dev_kfree_skb_any(struct sk_buff *skb);
處理 socket 緩存的分配和釋放的函數(shù). 通常驅(qū)動應(yīng)當(dāng)使用 dev_ 變體, 其意圖就是此目的.
unsigned char *skb_put(struct sk_buff *skb, int len);
unsigned char *__skb_put(struct sk_buff *skb, int len);
unsigned char *skb_push(struct sk_buff *skb, int len);
unsigned char *__skb_push(struct sk_buff *skb, int len);
添加數(shù)據(jù)到一個 skb 的函數(shù); skb_put 在 skb 的尾部放置數(shù)據(jù), 而 skb_push 放在開始. 正常版本進(jìn)行檢查以確保有足夠的空間; 雙下劃線版本不進(jìn)行檢查.
int skb_headroom(struct sk_buff *skb);
int skb_tailroom(struct sk_buff *skb);
void skb_reserve(struct sk_buff *skb, int len);
進(jìn)行 skb 中的空間管理的函數(shù). skb_headroom 和 skb_tailroom 說明在開始和結(jié)尾分別有多少空間可用. skb_reserve 可用來保留空間, 在一個必須為空的 skb 開始.
unsigned char *skb_pull(struct sk_buff *skb, int len);
skb_pull "去除" 數(shù)據(jù)從一個 skb, 通過調(diào)整內(nèi)部指針.
int skb_is_nonlinear(struct sk_buff *skb);
如果這個 skb 是為發(fā)散/匯聚 I/O 分隔為幾個片, 函數(shù)返回一個真值.
int skb_headlen(struct sk_buff *skb);
返回 skb 的第一個片的長度, 由 skb->data 指向.
void *kmap_skb_frag(skb_frag_t *frag);
void kunmap_skb_frag(void *vaddr);
提供對非線性 skb 中的片直接存取的函數(shù).
#include <linux/etherdevice.h>
void ether_setup(struct net_device *dev);
為以太網(wǎng)驅(qū)動設(shè)置大部分方法為通用實現(xiàn)的函數(shù). 它還設(shè)置 dev->flags 和安排下一個可用的 ethx 給 dev->name, 如果名子的第一個字符是一個空格或者 NULL 字符.
unsigned short eth_type_trans(struct sk_buff *skb, struct net_device *dev);
當(dāng)一個以太網(wǎng)接口收到一個報文, 這個函數(shù)被調(diào)用來設(shè)置 skb->pkt_type. 返回值是一個協(xié)議號, 通常存儲于 skb->protocol.
#include <linux/sockios.h>
SIOCDEVPRIVATE
前 16 個 ioctl 命令, 每個驅(qū)動可為它們自己的私有用途而實現(xiàn). 所有的網(wǎng)絡(luò) ioctl 命令都在 sockios.h 中定義.
#include <linux/mii.h>
struct mii_if_info;
聲明和一個結(jié)構(gòu), 支持實現(xiàn) MII 標(biāo)準(zhǔn)的設(shè)備的驅(qū)動.
#include <linux/ethtool.h>
struct ethtool_ops;
聲明和結(jié)構(gòu), 使得設(shè)備與 ethtool 工具一起工作.
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: