數據包的發送:
~~~
void priv;/ pointer to private data分配結構體的時候會多分配一塊內存用來存放私人數據*/
int(*hard_start_xmit) (struct sk_buff *skb,struct net_device *dev);
~~~
struct sk_buff *skb是網絡設備驅動程序中另一個重要的數據結構,通常叫做套接字緩沖區 skb->data指向發送數據包在內存中的位子,而skb->len則是以字節為單位的該數據的長度 第二個參數dev自然就是本次用來發送網絡數據的設備對象了。
驅動程序通常使用DMA的方式將套接字緩沖區中的數據傳輸到網絡設備的存儲空間,然后由網絡設備的硬件邏輯負責把設備存儲空間剛接受到的數據發送出去,在數據發送成功后,會產生一個硬件中斷已通知驅動程序 進行相應的處理,比如釋放上層傳下來的套接字緩沖區,將要發送的數據封裝在套接字緩沖器 skb中。需要注意的是,網絡子系統高層傳下來的額套接字緩沖區需要有設備驅動程序在完成一次 DMA傳輸后負責釋放。
數據包的接受:
`int netif_rx(struct sk_buff *skb) `
如同網路數據包的發送一樣,驅動程序中接收數據包的實現方法依然依賴于具體的硬件設備,但是這個 通常驅動程序需要分配一個套接字緩沖區skb來容納收到的數據包,然后將skb傳遞到網絡子系統的 上層代碼中,后者負責釋放skb所占用的內存。將接受到的數據加入一個隊列,觸發一個軟中斷標志位, 返回式基本就意味著接受數據包的中斷處理函數任務已經完成。