Linux網(wǎng)絡(luò )驅動(dòng)程序功能分析
//解析包的協(xié)議本文引用地址:http://dyxdggzs.com/article/148970.htm
skb->protocol = eth_type_trans(skb, tp->dev);
//把包送到協(xié)議層
netif_rx(skb);
//記錄收包時(shí)間
tp->dev->last_rx = jiffies;
}
10.讀取包的網(wǎng)卡收發(fā)包的狀態(tài),統計數據
static struct net_device_stats *tg3_get_stats(struct net_device *dev)
{
//從硬件相關(guān)的寄存器讀取數據,累加
//stats->rx_packets, stats->tx_packets, stats->rx_bytes, stats->tx_bytes等
}
11.用戶(hù)的ioctl命令系統調用
static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
{
struct mii_ioctl_data *data = (struct mii_ioctl_data *)ifr->ifr_data;
switch(cmd) {
//ethtool程序命令的調用
case SIO*HTOOL:
return tg3_ethtool_ioctl(dev, (void *) ifr->ifr_data);
//mii程序命令的調用
case SIOCGMIIREG: {
err = tg3_readphy(tp, data->reg_num 0x1f, mii_regval)
data->val_out = mii_regval;
return err;
}
……
}
}
12.PCI設備的掛起和恢復函數
static int tg3_suspend(struct pci_dev *pdev, u32 state)
{
//停用網(wǎng)卡的中斷寄存器
tg3_disable_ints(tp);
//停止網(wǎng)卡收發(fā)包
netif_device_detach(dev);
//停止網(wǎng)卡某些硬件,fireware的一些功能
tg3_halt(tp);
//設置網(wǎng)卡的電源狀態(tài)
tg3_set_power_state(tp, state);
}
static int tg3_resume(struct pci_dev *pdev)
{
//恢復網(wǎng)卡電源
tg3_set_power_state(tp, 0);
//允許網(wǎng)卡收發(fā)包
netif_device_attach(dev);
//初始化收發(fā)包的緩沖區
tg3_init_rings(tp);
//初始化網(wǎng)卡硬件
tg3_init_hw(tp);
//打開(kāi)網(wǎng)卡中斷寄存器
tg3_enable_ints(tp);
}
13.參數設置
在驅動(dòng)程序里還提供一些方法供系統對設備的參數進(jìn)行設置和讀取信息。一般只有超級用戶(hù)(root)權限才能對設備參數進(jìn)行設置。設置方法有:
tg3_set_mac_addr (dev->set_mac_address)
當用戶(hù)調用ioctl類(lèi)型為SIOCSIFHWADDR時(shí)是要設置這個(gè)設備的mac地址。一般對mac地址的設置沒(méi)有太大意義的。
dev->set_config()
當用戶(hù)調用ioctl時(shí)類(lèi)型為SIOCSIFMAP時(shí),系統會(huì )調用驅動(dòng)程序的set_config方法
用戶(hù)會(huì )傳遞一個(gè)ifmap結構包含需要的I/O、中斷等參數。
總結:
所有的Linux網(wǎng)絡(luò )驅動(dòng)程序遵循通用的接口。設計時(shí)采用的是面向對象的方法。一個(gè)設備就是一個(gè)對象(net_device 結構),它內部有自己的數據和方法。一個(gè)網(wǎng)絡(luò )設備最基本的方法有初始化,發(fā)送和接收。
Linux網(wǎng)絡(luò )驅動(dòng)程序的體系結構可以劃分為四層:
網(wǎng)絡(luò )協(xié)議接口,網(wǎng)絡(luò )設備接口,設備驅動(dòng)功能,網(wǎng)絡(luò )設備和網(wǎng)絡(luò )媒介層
網(wǎng)絡(luò )驅動(dòng)程序,最主要的工作就是完成設備驅動(dòng)功能層。在Linux中所有網(wǎng)絡(luò )設備都抽象為一個(gè)接口,這個(gè)接口提供了對所有網(wǎng)絡(luò )設備的操作集合。由數據結構struct net_device來(lái)表示網(wǎng)絡(luò )設備在內核中的運行情況,即網(wǎng)絡(luò )設備接口。它既包括純軟件網(wǎng)絡(luò )設備接口,如環(huán)路(Loopback),也包括硬件網(wǎng)絡(luò )設備接口,如以太網(wǎng)卡。而由以dev_base為頭指針的設備鏈表來(lái)集體管理所有網(wǎng)絡(luò )設備,該設備鏈表中的每個(gè)元素代表一個(gè)網(wǎng)絡(luò )設備接口。數據結構net_device中有很多供系統訪(fǎng)問(wèn)和協(xié)議層調用的設備方法,包括初始化,打開(kāi)和關(guān)閉網(wǎng)絡(luò )設備的open和stop函數,處理數據包發(fā)送的hard_start_xmit函數,以及中斷處理函數等。
網(wǎng)絡(luò )設備在Linux里做專(zhuān)門(mén)的處理。Linux的網(wǎng)絡(luò )系統主要是基于BSD unix的socket機制。在系統和驅動(dòng)程序之間定義有專(zhuān)門(mén)的數據結構(sk_buff)進(jìn)行數據的傳遞。系統里支持對發(fā)送數據和接收數據的緩存,提供流量控制機制,提供對多協(xié)議的支持。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論