17.3. net_device 結(jié)構(gòu)的詳情

2018-02-24 15:50 更新

17.3.?net_device 結(jié)構(gòu)的詳情

net_device 結(jié)構(gòu)處于網(wǎng)絡(luò)驅(qū)動(dòng)層的非常核心的位置并且值得完全的描述. 這個(gè)列表描述了所有成員, 更多的是提供了一個(gè)參考而不是用來備忘. 本章剩下的部分簡要地描述了每個(gè)成員, 一旦它用在例子代碼上, 因此你不需要不停地回看這一節(jié).

17.3.1.?全局信息

結(jié)構(gòu) net_device 的第一部分是由下面成員組成:

char name[IFNAMSIZ];
設(shè)備名子. 如果名子由驅(qū)動(dòng)設(shè)置, 包含一個(gè) %d 格式串, register_netdev 用一個(gè)數(shù)替換它來形成一個(gè)唯一的名子; 分配的編號(hào)從 0 開始.

unsigned long state;
設(shè)備狀態(tài). 這個(gè)成員包括幾個(gè)標(biāo)志. 驅(qū)動(dòng)正常情況下不直接操作這些標(biāo)志; 相反, 提供了一套實(shí)用函數(shù). 這些函數(shù)在我們進(jìn)入驅(qū)動(dòng)操作后馬上討論這些函數(shù).

struct net_device *next;
全局列表中指向下一個(gè)設(shè)備的指針. 這個(gè)成員驅(qū)動(dòng)不能動(dòng).

int (init)(struct net_device dev);
一個(gè)初始化函數(shù). 如果設(shè)置了這個(gè)指針, 這個(gè)函數(shù)被 register_netdev 調(diào)用來完成對(duì) net_device 結(jié)構(gòu)的初始化. 大部分現(xiàn)代的網(wǎng)絡(luò)驅(qū)動(dòng)不再使用這個(gè)函數(shù); 相反, 初始化在注冊(cè)接口前進(jìn)行.

17.3.2.?硬件信息

下面的成員包含了相對(duì)簡單設(shè)備的低層硬件信息. 它們是早期 Linux 網(wǎng)絡(luò)的延續(xù); 大部分現(xiàn)代驅(qū)動(dòng)確實(shí)使用它們(可能的例外是 if_port ). 我們?yōu)橥暾鹨娫谶@里列出.

unsigned long rmem_end;unsigned long rmem_start;unsigned long mem_end;unsigned long mem_start;
設(shè)備內(nèi)存信息. 這些成員持有設(shè)備使用的共享內(nèi)存的開始和結(jié)束地址. 如果設(shè)備有不同的接收和發(fā)送內(nèi)存, mem 成員由發(fā)送內(nèi)存使用, rmem 成員由接收內(nèi)存使用. rmem 成員在驅(qū)動(dòng)之外從不被引用. 慣例上, 設(shè)置 end 成員, 所以 end - start 是可用的板上內(nèi)存的數(shù)量.

unsigned long base_addr;
網(wǎng)絡(luò)接口的 I/O 基地址. 這個(gè)成員, 如同前面的, 由驅(qū)動(dòng)在設(shè)備探測時(shí)賦值. ifconfig 目錄可用來顯示或修改當(dāng)前值. base_addr 可以當(dāng)系統(tǒng)啟動(dòng)時(shí)在內(nèi)核命令行中顯式賦值( 通過 netdev= 參數(shù)), 或者在模塊加載時(shí). 這個(gè)成員, 象上面描述過的內(nèi)存成員, 內(nèi)核不使用它們.

unsigned char irq;
安排的中斷號(hào). 當(dāng)接口被列出時(shí) ifconfig 打印出 dev->irq 的值. 這個(gè)值常常在啟動(dòng)或者加載時(shí)間設(shè)置并且在后來由 ifconfig 打印.

unsigned char if_port;
在多端口設(shè)備中使用的端口. 例如, 這個(gè)成員用在同時(shí)支持同軸線(IF_PORT_10BASE2)和雙絞線(IF_PORT_100BSAET)以太網(wǎng)連接. 完整的已知端口類型設(shè)置定義在 <linux/netdevie.h>.

unsigned char dma;
設(shè)備分配的 DMA 通道. 這個(gè)成員只在某些外設(shè)總線時(shí)有意義, 例如 ISA. 它不在設(shè)備驅(qū)動(dòng)自身以外使用, 只是為了信息目的( 在 ifconfig ) 中.

17.3.3.?接口信息

有關(guān)接口的大部分信息由 ether_setup 函數(shù)正確設(shè)置(或者任何其他對(duì)給定硬件類型適合的設(shè)置函數(shù)). 以太網(wǎng)卡可以依賴這個(gè)通用的函數(shù)設(shè)置大部分這些成員, 但是 flags 和 dev_addr 成員是特定設(shè)備的, 必須在初始化時(shí)間明確指定.

一些非以太網(wǎng)接口可以使用類似 ether_setup 的幫助函數(shù). deviers/net/net_init.c 輸出了一些類似的函數(shù), 包括下列:

void ltalk_setup(struct net_device *dev);
設(shè)置一個(gè) LocalTalk 設(shè)備的成員

void fc_setup(struct net_device *dev);
初始化光通道設(shè)備的成員

void fddi_setup(struct net_device *dev);
配置一個(gè)光纖分布數(shù)據(jù)接口 (FDDI) 網(wǎng)絡(luò)的接口

void hippi_setup(struct net_device *dev);
預(yù)備給一個(gè)高性能并行接口 (HIPPI) 的高速互連驅(qū)動(dòng)的成員

void tr_setup(struct net_device *dev);
處理令牌環(huán)網(wǎng)絡(luò)接口的設(shè)置

大部分設(shè)備會(huì)歸于這些類別中的一類. 如果你的是全新和不同的, 但是, 你需要手工賦值下面的成員:

unsigned short hard_header_len;
硬件頭部長度, 就是, 被發(fā)送報(bào)文前面在 IP 頭之前的字節(jié)數(shù), 或者別的協(xié)議信息. 對(duì)于以太網(wǎng)接口 hard_header_len 值是 14 (ETH_HLEN).

unsigned mtu;
最大傳輸單元 (MTU). 這個(gè)成員是網(wǎng)絡(luò)層用作驅(qū)動(dòng)報(bào)文傳輸. 以太網(wǎng)有一個(gè) 1500 字節(jié)的 MTU (ETH_DATA_LEN). 這個(gè)值可用 ifconfig 改變.

unsigned long tx_queue_len;
設(shè)備發(fā)送隊(duì)列中可以排隊(duì)的最大幀數(shù). 這個(gè)值由 ether_setup 設(shè)置為 1000, 但是你可以改它. 例如, plip 使用 10 來避免浪費(fèi)系統(tǒng)內(nèi)存( 相比真實(shí)以太網(wǎng)接口, plip 有一個(gè)低些的吞吐量).

unsigned short type;
接口的硬件類型. 這個(gè) type 成員由 ARP 用來決定接口支持什么樣的硬件地址. 對(duì)以太網(wǎng)接口正確的值是 ARPHRD_ETHER, 這是由 ether_setup 設(shè)置的值. 可認(rèn)識(shí)的類型定義于 <linux/if_arp.h>.

unsigned char addr_len;unsigned char broadcast[MAX_ADDR_LEN];unsigned char dev_addr[MAX_ADDR_LEN];
硬件 (MAC) 地址長度和設(shè)備硬件地址. 以太網(wǎng)地址長度是 6 個(gè)字節(jié)( 我們指的是接口板的硬件 ID ), 廣播地址由 6 個(gè) 0xff 字節(jié)組成; ether_setup 安排成正確的值. 設(shè)備地址, 另外, 必須以特定于設(shè)備的方式從接口板讀出, 驅(qū)動(dòng)應(yīng)當(dāng)將它拷貝到 dev_addr. 硬件地址用來產(chǎn)生正確的以太網(wǎng)頭, 在報(bào)文傳遞給驅(qū)動(dòng)發(fā)送之前. snull 設(shè)備不使用物理接口, 它創(chuàng)造自己的硬件接口.

unsigned short flags;int features;
接口標(biāo)志(下面詳述)

這個(gè) flags 成員是一個(gè)位掩碼, 包括下面的位值. IFF_ 前綴代表 "interface flags". 有些標(biāo)志由內(nèi)核管理, 有些由接口在初始化時(shí)設(shè)置來表明接口的能力和其他特性. 有效的標(biāo)志, 對(duì)應(yīng)于 <linux/if.h>, 有:

IFF_UP
對(duì)驅(qū)動(dòng)這個(gè)標(biāo)志是只讀的. 內(nèi)核打開它當(dāng)接口激活并準(zhǔn)備號(hào)傳送報(bào)文時(shí).

IFF_BROADCAST
這個(gè)標(biāo)志(由網(wǎng)絡(luò)代碼維護(hù))說明接口允許廣播. 以太網(wǎng)板是這樣.

IFF_DEBUG
這個(gè)標(biāo)識(shí)了調(diào)試模式. 這個(gè)標(biāo)志用來控制你的 printk 調(diào)用的復(fù)雜性或者用于其他調(diào)試目的. 盡管當(dāng)前沒有 in-tree 驅(qū)動(dòng)使用這個(gè)標(biāo)志, 它可以通過 ioctl 來設(shè)置和重置, 你的驅(qū)動(dòng)可用它. misc-progs/netifdebug 程序可以用來打開或關(guān)閉這個(gè)標(biāo)志.

IFF_LOOPBACK
這個(gè)標(biāo)志應(yīng)當(dāng)只在環(huán)回接口中設(shè)置. 內(nèi)核檢查 IFF_LOOPBACK , 以代替硬連線 lo 名子作為一個(gè)特殊接口.

IFF_POINTOPOINT
這個(gè)標(biāo)志說明接口連接到一個(gè)點(diǎn)對(duì)點(diǎn)鏈路. 它由驅(qū)動(dòng)設(shè)置或者, 有時(shí), 由 ifconfig. 例如, plip 和 PPP 驅(qū)動(dòng)設(shè)置它.

IFF_NOARP
這個(gè)說明接口不能進(jìn)行 ARP. 例如, 點(diǎn)對(duì)點(diǎn)接口不需要運(yùn)行 ARP, 它只能增加額外的流量卻沒有任何有用的信息. snull 在沒有 ARP 能力的情況下運(yùn)行, 因此它設(shè)置這個(gè)標(biāo)志.

IFF_PROMISC
這個(gè)標(biāo)志設(shè)置(由網(wǎng)絡(luò)代碼)來激活混雜操作. 缺省地, 以太網(wǎng)接口使用硬件過濾器來保證它們只接收廣播報(bào)文和直接到接口硬件地址的報(bào)文. 報(bào)文嗅探器, 例如 tcpdump, 在接口上設(shè)置混雜模式來存取在接口發(fā)送介質(zhì)上經(jīng)過的所有報(bào)文.

IFF_MULTICAST
驅(qū)動(dòng)設(shè)置這個(gè)標(biāo)志來表示接口能夠組播發(fā)送. ether_setup 設(shè)置 IFF_MULTICAST 缺省地, 因此如果你的驅(qū)動(dòng)不支持組播, 必須在初始化時(shí)清除這個(gè)標(biāo)志.

IFF_ALLMULTI
這個(gè)標(biāo)志告知接口接收所有的組播報(bào)文. 內(nèi)核在主機(jī)進(jìn)行組播路由時(shí)設(shè)置它, 前提是 IFF_MULTICAST 置位. IFF_ALLMULTI 對(duì)驅(qū)動(dòng)是只讀的. 組播標(biāo)志在本章后面的"組播"一節(jié)中用到.

IFF_MASTERIFF_SLAVE
這些標(biāo)志由負(fù)載均衡代碼使用. 接口驅(qū)動(dòng)不需要知道它們.

IFF_PORTSELIFF_AUTOMEDIA
這些標(biāo)志指出設(shè)備可以在多個(gè)介質(zhì)類型間切換; 例如, 無屏蔽雙絞線 (UTP) 和 同軸以太網(wǎng)電纜. 如果 IFF_AUTOMEDIA 設(shè)置了, 設(shè)備自動(dòng)選擇正確的介質(zhì). 特別地, 內(nèi)核一個(gè)也不使用這 2 個(gè)標(biāo)志.

IFF_DYNAMIC
這個(gè)標(biāo)志, 由驅(qū)動(dòng)設(shè)置, 指出接口的地址能夠變化. 目前內(nèi)核沒有使用.

IFF_RUNNING
這個(gè)標(biāo)志指出接口已啟動(dòng)并在運(yùn)行. 它大部分是因?yàn)楹?BSD 兼容; 內(nèi)核很少用它. 大部分網(wǎng)絡(luò)驅(qū)動(dòng)不需要擔(dān)心 IFF_RUNNING.

IFF_NOTRAILERS
在 Linux 中不用這個(gè)標(biāo)志, 為了 BSD 兼容才存在.

當(dāng)一個(gè)程序改變 IFF_UP, open 或者 stop 設(shè)備方法被調(diào)用. 進(jìn)而, 當(dāng) IFF_UP 或者任何別的標(biāo)志修改了, set_multicast_list 方法被調(diào)用. 如果驅(qū)動(dòng)需要進(jìn)行某些動(dòng)作來響應(yīng)標(biāo)志的修改, 它必須在 set_multicast_list 中采取動(dòng)作. 例如, 當(dāng) IFF_PROMISC 被置位或者復(fù)位, set_multicast_list 必須通知板上的硬件過濾器. 這個(gè)設(shè)備方法的責(zé)任在"組播"一節(jié)中講解.

結(jié)構(gòu) net_device 的特性成員由驅(qū)動(dòng)設(shè)置來告知內(nèi)核關(guān)于任何的接口擁有的特別硬件能力. 我們將談?wù)撘恍┻@些特性; 別的就超出了本書范圍. 完整的集合是:

NETIF_F_SGNETIF_F_FRAGLIST
2 個(gè)標(biāo)志控制發(fā)散/匯聚 I/O 的使用. 如果你的接口可以發(fā)送一個(gè)報(bào)文, 它由幾個(gè)不同的內(nèi)存段組成, 你應(yīng)當(dāng)設(shè)置 NETIF_F_SG. 當(dāng)然, 你不得不實(shí)際實(shí)現(xiàn)發(fā)散/匯聚 I/O( 我們?cè)?發(fā)散/匯聚"一節(jié)中描述如何做 ). NETIF_F_FRAGLIST 表明你的接口能夠處理分段的報(bào)文; 在 2.6 中只有環(huán)回驅(qū)動(dòng)做這一點(diǎn).

注意內(nèi)核不對(duì)你的設(shè)備進(jìn)行發(fā)散/匯聚 I/O 操作, 如果它沒有同時(shí)提供某些校驗(yàn)和形式. 理由是, 如果內(nèi)核不得不跨過一個(gè)分片的("非線性")的報(bào)文來計(jì)算校驗(yàn)和, 它可能也拷貝數(shù)據(jù)并同時(shí)接合報(bào)文.

NETIF_F_IP_CSUMNETIF_F_NO_CSUMNETIF_F_HW_CSUM
這些標(biāo)志都是告知內(nèi)核, 不需要給一些或所有的通過這個(gè)接口離開系統(tǒng)的報(bào)文進(jìn)行校驗(yàn). 如果你的接口可以校驗(yàn) IP 報(bào)文但是別的不行, 就設(shè)置 NETIF_F_IP_CSUM. 如果這個(gè)接口不曾要求校驗(yàn)和, 就設(shè)置 NETIF_F_NO_CSUM. 環(huán)回驅(qū)動(dòng)設(shè)置了這個(gè)標(biāo)志, snull 也設(shè)置; 因?yàn)閳?bào)文只通過系統(tǒng)內(nèi)存?zhèn)魉? 對(duì)它們來說沒有機(jī)會(huì)( 1 跳 )被破壞, 沒有必要校驗(yàn)它們. 如果你的硬件自己做校驗(yàn), 設(shè)置 NETIF_F_HW_CWSUM.

NETIF_F_HIGHDMA
設(shè)置這個(gè)標(biāo)志, 如果你的設(shè)備能夠?qū)Ω叨藘?nèi)存進(jìn)行 DMA. 沒有這個(gè)標(biāo)志, 所有提供給你的驅(qū)動(dòng)的報(bào)文在低端內(nèi)存分配.

NETIF_F_HW_VLAN_TXNETIF_F_HW_VLAN_RXNETIF_F_HW_VLAN_FILTERNETIF_F_VLAN_CHALLENGED
這些選項(xiàng)描述你的硬件對(duì) 802.1q VLAN 報(bào)文的支持. VLAN 支持超出我們本章的內(nèi)容. 如果 VLAN 報(bào)文使你的設(shè)備混亂( 其實(shí)不應(yīng)該 ), 設(shè)置標(biāo)志 NETIF_F_VLAN_CHALLENGED.

NETIF_F_TSO
如果你的設(shè)備能夠進(jìn)行 TCP 分段卸載, 設(shè)置這個(gè)標(biāo)志. TSO 是一個(gè)我們?cè)谶@不涉及的高級(jí)特性.

17.3.4.?設(shè)備方法

如同在字符和塊驅(qū)動(dòng)的一樣, 每個(gè)網(wǎng)絡(luò)設(shè)備聲明能操作它的函數(shù). 本節(jié)列出能夠?qū)W(wǎng)絡(luò)接口進(jìn)行的操作. 有些操作可以留作 NULL, 別的常常是不被觸動(dòng)的, 因?yàn)?ether_setup 給它們安排了合適的方法.

網(wǎng)絡(luò)接口的設(shè)備方法可分為 2 組: 基本的和可選的. 基本方法包括那些必需的能夠使用接口的; 可選的方法實(shí)現(xiàn)更多高級(jí)的不是嚴(yán)格要求的功能. 下列是基本方法:

int (open)(struct net_device dev);
打開接口. 任何時(shí)候 ifconfig 激活它, 接口被打開. open 方法應(yīng)當(dāng)注冊(cè)它需要的任何系統(tǒng)資源( I/O 口, IRQ, DMA, 等等), 打開硬件, 進(jìn)行任何別的你的設(shè)備要求的設(shè)置.

int (stop)(struct net_device dev);
停止接口. 接口停止當(dāng)它被關(guān)閉. 這個(gè)函數(shù)應(yīng)當(dāng)恢復(fù)在打開時(shí)進(jìn)行的操作.

int (hard_start_xmit) (struct sk_buff skb, struct net_device *dev);
起始報(bào)文的發(fā)送的方法. 完整的報(bào)文(協(xié)議頭和所有)包含在一個(gè) socket 緩存區(qū)( sk_buff ) 結(jié)構(gòu). socket 緩存在本章后面介紹.

int (hard_header) (struct sk_buff skb, struct net_device dev, unsigned short type, void daddr, void *saddr, unsigned len);
用之前取到的源和目的硬件地址來建立硬件頭的函數(shù)(在 hard_start_xmit 前調(diào)用). 它的工作是將作為參數(shù)傳給它的信息組織成一個(gè)合適的特定于設(shè)備的硬件頭. eth_header 是以太網(wǎng)類型接口的缺省函數(shù), ether_setup 針對(duì)性地對(duì)這個(gè)成員賦值.

int (rebuild_header)(struct sk_buff skb);
用來在 ARP 解析完成后但是在報(bào)文發(fā)送前重建硬件頭的函數(shù). 以太網(wǎng)設(shè)備使用的缺省的函數(shù)使用 ARP 支持代碼來填充報(bào)文缺失的信息.

void (tx_timeout)(struct net_device dev);
由網(wǎng)絡(luò)代碼在一個(gè)報(bào)文發(fā)送沒有在一個(gè)合理的時(shí)間內(nèi)完成時(shí)調(diào)用的方法, 可能是丟失一個(gè)中斷或者接口被鎖住. 它應(yīng)當(dāng)處理這個(gè)問題并恢復(fù)報(bào)文發(fā)送.

struct net_device_stats (get_stats)(struct net_device *dev);
任何時(shí)候當(dāng)一個(gè)應(yīng)用程序需要獲取接口的統(tǒng)計(jì)信息, 調(diào)用這個(gè)方法. 例如, 當(dāng) ifconfig 或者 netstat -i 運(yùn)行時(shí). snull 的一個(gè)例子實(shí)現(xiàn)在"統(tǒng)計(jì)信息"一節(jié)中介紹.

int (set_config)(struct net_device dev, struct ifmap *map);
改變接口配置. 這個(gè)方法是配置驅(qū)動(dòng)的入口點(diǎn). 設(shè)備的 I/O 地址和中斷號(hào)可以在運(yùn)行時(shí)使用 set_config 來改變. 這種能力可由系統(tǒng)管理員在接口沒有探測到時(shí)使用. 現(xiàn)代硬件正常的驅(qū)動(dòng)一般不需要實(shí)現(xiàn)這個(gè)方法.

剩下的設(shè)備操作是可選的:

int weight;int (poll)(struct net_device dev; int *quota);
由適應(yīng) NAPI 的驅(qū)動(dòng)提供的方法, 用來在查詢模式下操作接口, 中斷關(guān)閉著. NAPI ( 以及 weight 成員) 在"接收中斷緩解"一節(jié)中涉及.

void (poll_controller)(struct net_device dev);
在中斷關(guān)閉的情況下, 要求驅(qū)動(dòng)檢查接口上的事件的函數(shù). 它用于特殊的內(nèi)核中的網(wǎng)絡(luò)任務(wù), 例如遠(yuǎn)程控制臺(tái)和使用網(wǎng)絡(luò)的內(nèi)核調(diào)試.

int (do_ioctl)(struct net_device dev, struct ifreq *ifr, int cmd);
處理特定于接口的 ioctl 命令. (這些命令的實(shí)現(xiàn)在"定制 ioclt 命令"一節(jié)中描述)相應(yīng)的 net_device 結(jié)構(gòu)中的成員可留為 NULL, 如果接口不需要任何特定于接口的命令.

void (set_multicast_list)(struct net_device dev);
當(dāng)設(shè)備的組播列表改變和當(dāng)標(biāo)志改變時(shí)調(diào)用的方法. 詳情見"組播"一節(jié), 以及一個(gè)例子實(shí)現(xiàn).

int (set_mac_address)(struct net_device dev, void *addr);
如果接口支持改變它的硬件地址的能力, 可以實(shí)現(xiàn)這個(gè)函數(shù). 很多接口根本不支持這個(gè)能力. 其他的使用缺省的 eth_mac_adr 實(shí)現(xiàn)(在 deivers/net/net_init.c). eth_mac_addr 只拷貝新地址到 dev->dev_addr, 只在接口沒有運(yùn)行時(shí)作這件事. 使用 eth_mac_addr 的驅(qū)動(dòng)應(yīng)當(dāng)在它們的 open 方法中自 dev->dev_addr 里設(shè)置硬件 MAC 地址.

int (change_mtu)(struct net_device dev, int new_mtu);
當(dāng)接口的最大傳輸單元 (MTU) 改變時(shí)動(dòng)作的函數(shù). 如果用戶改變 MTU 時(shí)驅(qū)動(dòng)需要做一些特殊的事情, 它應(yīng)當(dāng)聲明它的自己的函數(shù); 否則, 缺省的會(huì)將事情做對(duì). snull 有對(duì)這個(gè)函數(shù)的一個(gè)模板, 如果你有興趣.

int (header_cache) (struct neighbour neigh, struct hh_cache *hh);
header_cache 被調(diào)用來填充 hh_cache 結(jié)構(gòu), 使用一個(gè) ARP 請(qǐng)求的結(jié)果. 幾乎全部類似以太網(wǎng)的驅(qū)動(dòng)可以使用缺省的 eth_header_cache 實(shí)現(xiàn).

int (header_cache_update) (struct hh_cache hh, struct net_device dev, unsigned char haddr);
在響應(yīng)一個(gè)變化中, 更新 hh_cache 結(jié)構(gòu)中的目的地址的方法. 以太網(wǎng)設(shè)備使用 eth_header_cache_update.

int (hard_header_parse) (struct sk_buff skb, unsigned char *haddr);
hard_header_parse 方法從包含在 skb 中的報(bào)文中抽取源地址, 拷貝到 haddr 的緩存區(qū). 函數(shù)的返回值是地址的長度. 以太網(wǎng)設(shè)備通常使用 eth_header_parse.

17.3.5.?公用成員

結(jié)構(gòu) net_device 剩下的數(shù)據(jù)成員由接口使用來持有有用的狀態(tài)信息. 有些是 ifconfig 和 netstat 用來提供給用戶關(guān)于當(dāng)前配置的信息. 因此, 接口應(yīng)當(dāng)給這些成員賦值:

unsigned long trans_start;unsigned long last_rx;
保存一個(gè) jiffy 值的成員. 驅(qū)動(dòng)負(fù)責(zé)分別更新這些值, 當(dāng)開始發(fā)送和收到一個(gè)報(bào)文時(shí). trans_start 值被網(wǎng)絡(luò)子系統(tǒng)用來探測發(fā)送器加鎖. last_rx 目前沒有用到, 但是驅(qū)動(dòng)應(yīng)當(dāng)盡量維護(hù)這個(gè)成員以備將來使用.

int watchdog_timeo;
網(wǎng)絡(luò)層認(rèn)為一個(gè)傳送超時(shí)發(fā)生前應(yīng)當(dāng)過去的最小時(shí)間(按 jiffy 計(jì)算), 調(diào)用驅(qū)動(dòng)的 tx_timeout 函數(shù).

void *priv;
filp->private_data 的對(duì)等者. 在現(xiàn)代的驅(qū)動(dòng)里, 這個(gè)成員由 alloc_netdev 設(shè)置, 不應(yīng)當(dāng)直接存取; 使用 netdev_priv 代替.

struct dev_mc_list *mc_list;int mc_count;
處理組播發(fā)送的成員. mc_count 是 mc_list 中的項(xiàng)數(shù)目. 更多細(xì)節(jié)見"組播"一節(jié).

spinlock_t xmit_lock;int xmit_lock_owner;
xmit_lock 用來避免對(duì)驅(qū)動(dòng)的 hard_start_xmit 函數(shù)多個(gè)同時(shí)調(diào)用. xmit_lock_owner 是已獲得 xmit_lock 的CPU號(hào). 驅(qū)動(dòng)應(yīng)當(dāng)不改變這些成員的值.

結(jié)構(gòu) net_device 中有其他的成員, 但是網(wǎng)絡(luò)驅(qū)動(dòng)用不著它們.

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)