17.16. 快速參考

2018-02-24 15:50 更新

17.16.?快速參考

本節(jié)提供了本章中介紹的概念的參考. 也解釋了每個(gè)驅(qū)動需要包含的頭文件的角色. 在 net_device 和 sk_buff 結(jié)構(gòu)中成員的列表, 但是, 這里沒有重復(fù).

#include <linux/netdevice.h>

定義 struct net_device 和 struct net_device_stats 的頭文件, 包含了幾個(gè)其他網(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);

注冊和注銷一個(gè)網(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)計(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ū)動來發(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)啟動查詢接口; 它只是被 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ù); 它遞交一個(gè)報(bào)文給內(nèi)核. 當(dāng)一個(gè) NAPI 兼容的驅(qū)動已耗盡接收報(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ū)動的 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ū)動應(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ū)動設(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ū)動可為它們自己的私有用途而實(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ū)動.

#include <linux/ethtool.h>
struct ethtool_ops;

聲明和結(jié)構(gòu), 使得設(shè)備與 ethtool 工具一起工作.

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號