W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
本節(jié)提供了本章中介紹的概念的參考. 也解釋了每個(gè)驅(qū)動(dòng)需要包含的頭文件的角色. 在 net_device 和 sk_buff 結(jié)構(gòu)中成員的列表, 但是, 這里沒有重復(fù).
#include <linux/netdevice.h>
定義 struct net_device 和 struct net_device_stats 的頭文件, 包含了幾個(gè)其他網(wǎng)絡(luò)驅(qū)動(dòng)需要的頭文件.
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);
注冊和注銷一個(gè)網(wǎng)絡(luò)設(shè)備.
void *netdev_priv(struct net_device *dev);
獲取網(wǎng)絡(luò)設(shè)備結(jié)構(gòu)的驅(qū)動(dòng)私有區(qū)域的指針的函數(shù).
struct net_device_stats;
持有設(shè)備統(tǒng)計(jì)的結(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ū)動(dòng)來發(fā)送的報(bào)文的函數(shù). 沒有報(bào)文被傳送, 直到 netif_start_queue 被調(diào)用. netif_stop_queue 掛起發(fā)送, netif_wake_queue 重啟隊(duì)列并刺探網(wǎng)絡(luò)層重啟發(fā)送報(bào)文.
skb_shinfo(struct sk_buff *skb);
宏定義, 提供對報(bào)文緩存的"shared info"部分的存取.
void netif_rx(struct sk_buff *skb);
調(diào)用來通知內(nèi)核一個(gè)報(bào)文已經(jīng)收到并且封裝到一個(gè) socket 緩存中的函數(shù).
void netif_rx_schedule(dev);
來告訴內(nèi)核報(bào)文可用并且應(yīng)當(dāng)啟動(dòng)查詢接口; 它只是被 NAPI 兼容的驅(qū)動(dòng)使用.
int netif_receive_skb(struct sk_buff *skb);
void netif_rx_complete(struct net_device *dev);
應(yīng)當(dāng)只被 NAPI 兼容的驅(qū)動(dòng)使用. netif_receive_skb 是對于 netif_rx 的 NAPI 對等函數(shù); 它遞交一個(gè)報(bào)文給內(nèi)核. 當(dāng)一個(gè) NAPI 兼容的驅(qū)動(dòng)已耗盡接收報(bào)文的供應(yīng), 它應(yīng)當(dāng)重開中斷, 并且調(diào)用 netif_rx_complete 來停止查詢.
#include <linux/if.h>
由 netdevice.h 包含, 這個(gè)文件聲明接口標(biāo)志( IFF_ 宏定義 )和 struct ifmap, 它在網(wǎng)絡(luò)驅(qū)動(dòng)的 ioctl 實(shí)現(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 個(gè)函數(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)的定義, 以及幾個(gè)操作緩存的內(nèi)聯(lián)函數(shù). 這個(gè)頭文件由 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ū)動(dòng)應(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ù)到一個(gè) 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 可用來保留空間, 在一個(gè)必須為空的 skb 開始.
unsigned char *skb_pull(struct sk_buff *skb, int len);
skb_pull "去除" 數(shù)據(jù)從一個(gè) skb, 通過調(diào)整內(nèi)部指針.
int skb_is_nonlinear(struct sk_buff *skb);
如果這個(gè) skb 是為發(fā)散/匯聚 I/O 分隔為幾個(gè)片, 函數(shù)返回一個(gè)真值.
int skb_headlen(struct sk_buff *skb);
返回 skb 的第一個(gè)片的長度, 由 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ū)動(dòng)設(shè)置大部分方法為通用實(shí)現(xiàn)的函數(shù). 它還設(shè)置 dev->flags 和安排下一個(gè)可用的 ethx 給 dev->name, 如果名子的第一個(gè)字符是一個(gè)空格或者 NULL 字符.
unsigned short eth_type_trans(struct sk_buff *skb, struct net_device *dev);
當(dāng)一個(gè)以太網(wǎng)接口收到一個(gè)報(bào)文, 這個(gè)函數(shù)被調(diào)用來設(shè)置 skb->pkt_type. 返回值是一個(gè)協(xié)議號, 通常存儲于 skb->protocol.
#include <linux/sockios.h>
SIOCDEVPRIVATE
前 16 個(gè) ioctl 命令, 每個(gè)驅(qū)動(dòng)可為它們自己的私有用途而實(shí)現(xiàn). 所有的網(wǎng)絡(luò) ioctl 命令都在 sockios.h 中定義.
#include <linux/mii.h>
struct mii_if_info;
聲明和一個(gè)結(jié)構(gòu), 支持實(shí)現(xiàn) MII 標(biāo)準(zhǔn)的設(shè)備的驅(qū)動(dòng).
#include <linux/ethtool.h>
struct ethtool_ops;
聲明和結(jié)構(gòu), 使得設(shè)備與 ethtool 工具一起工作.
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: