W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
我們的驅(qū)動(dòng)可以在模塊加載時(shí)或者內(nèi)核啟動(dòng)時(shí)探測(cè)接口. 在接口能夠承載報(bào)文前, 但是, 內(nèi)核必須打開它并分配一個(gè)地址給它. 內(nèi)核打開或者關(guān)閉一個(gè)接口對(duì)應(yīng) ifconfig 命令.
當(dāng) ifconfig 用來(lái)給接口安排一個(gè)地址, 它做 2 個(gè)任務(wù). 第一, 它通過(guò) ioctl(SIOCSIFADDR)( Socket I/O Control Set Interface Address) 來(lái)安排地址. 接著它設(shè)置 dev->flag 的 IFF_UP 位, 通過(guò) ioctl(SIOCSIFFLAGS) ( Socket I/O Control Set Interface Flags) 來(lái)打開接口.
目前為止, ioctl(SIOCSIFADDR) 不做任何事. 沒(méi)有驅(qū)動(dòng)函數(shù)被調(diào)用 -- 這個(gè)任務(wù)是獨(dú)立于設(shè)備的, 并且是內(nèi)核實(shí)現(xiàn)它. 后面的命令 (ioctl(SIOCSIFFLAGS)), 但是, 為設(shè)備調(diào)用 open 方法.
相似地, 當(dāng)接口關(guān)閉, ifconfig 使用 ioctl(SIOCSIFFLAGS) 來(lái)清除 IFF_UP, 并且 stop 方法被調(diào)用.
2 個(gè)設(shè)備方法都返回 0 在成功時(shí), 并且出錯(cuò)時(shí)返回負(fù)值.
目前為止的實(shí)際代碼, 驅(qū)動(dòng)不得不進(jìn)行許多與字符和塊驅(qū)動(dòng)同樣的任務(wù). open 請(qǐng)求任何它需要的系統(tǒng)資源并且告知接口啟動(dòng); stop 關(guān)閉接口并釋放系統(tǒng)資源. 網(wǎng)絡(luò)驅(qū)動(dòng)必須進(jìn)行一些附加的步驟在 open 時(shí), 但是.
第一, 硬件 (MAC) 地址需要從硬件設(shè)備拷貝到 dev->dev_addr, 在接口可以和外部世界通訊之前. 硬件地址接著在 open 時(shí)拷貝到設(shè)備. snull 軟件接口在 open 里面安排它; 它只是使用了一個(gè)長(zhǎng)為 ETH_ALEN 的字符串偽造了一個(gè)硬件號(hào), ETH_ALEN 是以太網(wǎng)硬件地址長(zhǎng)度.
open 方法應(yīng)當(dāng)也啟動(dòng)接口的發(fā)送隊(duì)列( 允許它接受發(fā)送報(bào)文 ), 一旦它準(zhǔn)備好啟動(dòng)發(fā)送數(shù)據(jù). 內(nèi)核提供了一個(gè)函數(shù)來(lái)啟動(dòng)隊(duì)列:
void netif_start_queue(struct net_device *dev);
snull 的 open 代碼看來(lái)如下:
int snull_open(struct net_device *dev)
{
/* request_region(), request_irq( ), .... (like fops->open) */
/*
* Assign the hardware address of the board: use "\0SNULx", where
* x is 0 or 1. The first byte is '\0' to avoid being a multicast
* address (the first byte of multicast addrs is odd).
*/
memcpy(dev->dev_addr, "\0SNUL0", ETH_ALEN);
if (dev == snull_devs[1])
dev->dev_addr[ETH_ALEN-1]++; /* \0SNUL1 */
netif_start_queue(dev);
return 0;
}
如你所見, 在缺乏真實(shí)硬件的情況下, 在 open 方法中沒(méi)什么可做. stop 方法也一樣; 它只是反轉(zhuǎn) open 的操作. 因此, 實(shí)現(xiàn) stop 的函數(shù)常常稱為 close 或者 release.
int snull_release(struct net_device *dev)
{
/* release ports, irq and such -- like fops->close */
netif_stop_queue(dev); /* can't transmit any more */
return 0;
}
函數(shù):
void netif_stop_queue(struct net_device *dev);
是 netif_start_queue 的對(duì)立面; 它標(biāo)志設(shè)備為不能再發(fā)送任何報(bào)文. 這個(gè)函數(shù)必須在接口關(guān)閉( 在 stop 方法中 )時(shí)調(diào)用, 但以可用于暫時(shí)停止發(fā)送, 如下一節(jié)中解釋的.
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: