linux網路驅動程式編寫(二) 4
2001-06-15· ·bordi··飲水思源站12
3 4 5
2.2.6 硬體幀頭(hard_header)
硬體一般都會在上層資料傳送之前加上自己的硬體幀頭,比如乙太網(ether***)就有14位元組的幀頭。這個幀頭是加在上層ip、ipx等資料報的前 面的。驅動程式提供乙個hard_header方法,協議層(ip、ipx、arp等)在傳送資料之前會呼叫這段程式。硬體幀頭的長度必須填在dev- >hard_header_len,這樣協議層回在資料之前保留好硬體幀頭的空間。這樣hard_header程式只要呼叫skb_push然後正 確填入硬體幀頭就可以了。
在協議層呼叫hard_header時,傳送的引數包括(2.0.xx):資料的sk_buff,
device指標,protocol,目的位址(daddr),源位址(saddr),資料長度(len)。資料長度不要使用sk_buff中的引數, 因為呼叫hard_header時資料可能還沒完全組織好。saddr是null的話是使用預設位址(default)。daddr是null表明協議層 不知道硬體目的位址。如果hard_header完全填好了硬體幀頭,則返回新增的位元組數。如果硬體幀頭中的資訊還不完全(比如daddr為null,但 是幀頭中需要目的硬體位址。典型的情況是乙太網需要位址解析(arp)),則返回負位元組數。hard_header返回負數的情況下,協議層會做進一步的 build header的工作。目前linux系統裡就是做arp(如果hard_header返回正,dev->arp=1,表明不需要做 arp,返回負,dev->arp=0,做arp)。對hard_header的呼叫在每個協議層的處理程式裡。如ip_output。
2.2.7 位址解析(xarp)
有些網路有硬體位址(比如ether***),並且在傳送硬體幀時需要知道目的硬體位址。這樣就需要上層協議位址(ip、ipx)和硬體位址的對應。這 個對應是通過位址解析完成的。需要做arp的的裝置在傳送之前會呼叫驅動程式的rebuild_header方法。呼叫的主要引數包括指向硬體幀頭的指 針,協議層位址。如果驅動程式能夠解析硬體位址,就返回1,如果不能,返回0。
對rebuild_header的呼叫在***/core/dev.c的do_dev_queue_xmit()裡。
2.2.8 引數設定和統計資料
在驅動程式裡還提供一些方法供系統對裝置的引數進行設定和讀取資訊。一般只有超級使用者(root)許可權才能對裝置引數進行設定。設定方法有:
dev->set_mac_address()
當使用者呼叫ioctl型別為siocsifhwaddr時是要設定這個裝置的mac位址。一般對mac位址的設定沒有太大意義的。
dev->set_config()
當使用者呼叫ioctl時型別為siocsifmap時,系統會呼叫驅動程式的set_config方法。使用者會傳遞乙個ifmap結構包含需要的i/o、中斷等引數。
dev->do_ioctl()
dev->do_ioctl()
如果使用者呼叫ioctl時型別在siocdevprivate和siocdevprivate+15之間,系統會呼叫驅動程式的這個方法。一般是設定裝置的專用資料。
讀取資訊也是通過ioctl呼叫進行。除次之外驅動程式還可以提供乙個
dev->get_stats方法,返回乙個e***_statistics結構,包含傳送接收的統計資訊。
ioctl的處理在***/core/dev.c的dev_ioctl()和dev_ifsioc()裡。
Linux驅動程式編寫
linux作業系統網路驅動程式編寫 一.linux系統裝置驅動程式概述 1.1 linux裝置驅動程式分類 1.2 編寫驅動程式的一些基本概念 二.linux系統網路裝置驅動程式 2.1 網路驅動程式的結構 2.2 網路驅動程式的基本方法 2.3 網路驅動程式中用到的資料結構 2.4 常用的系統支援...
編寫Linux裝置驅動程式教程
序言 linux是unix作業系統的一種變種,在linux下編寫驅動程式的原理和思想完全類似於其他的unix系統,但它dos或window環境下的驅動程式有很大的區別。在linux環境下設計驅動程式,思想簡潔,操作方便,功能也很強大,但是支援函式少,只能依賴kernel中的函式,有些常用的操作要自己...
如何編寫Linux裝置驅動程式
感謝 上海一九四三啊 李大屌 reference 序言linux是unix作業系統的一種變種,在linux下編寫驅動程式的原理和思想完全類似於其他的unix系統,但它dos或window環境下的驅動程式有很大的區別。在linux環境下設計驅動程式,思想簡潔,操作方便,功能也很強大,但是支援函式少,只...