Linux回環網絡卡驅動設計

2021-08-03 08:50:29 字數 3414 閱讀 9889

回環網絡卡驅動

1.回環網絡卡和普通網絡卡的區別是他是虛擬的不是實際的物理網絡卡,它相當於把普通網絡卡的傳送端和接收端短接在一起。

2.在核心源**裡的回環網絡卡程式(drivers/net/loopback.c)不是以乙個模組的形式給出,但是他的初始化(loopback_net_init)和退出函式(loopback_dev_free)會被核心的其他部分呼叫到。

3.參照網絡卡初始化的流程圖進行設計驅動程式,其中分配net_device結構不能用alloc_etherdev函式,因為該函式是分配乙太網卡的結構體的,要用alloc_netdev函式來給回環網絡卡分配結構體。參考核心源**別人如何用使用這個函式alloc_netdev(0, "lo", loopback_setup);第乙個0表示net_device這個結構體的私有成員的大小,一般選擇0,第二個表示網絡卡名字,ifconfig顯示的名稱,第三個就是具體的網絡卡結構體的初始化函式指標。

struct net_device *dev;

dev = alloc_netdev(0, "lo", loopback_setup);

最終會呼叫到loopback_setup函式。(至於在將函式指標作為引數的時候如何傳遞形參,就要複習c語言了)

4.回環網絡卡不需要初始化硬體。所以直接註冊回環網絡卡的結構體到核心(第三步)。最後指定回環網絡卡註冊到網路子系統。

net->loopback_dev = dev;這一步很關鍵。

5.具體的初始化(loopback_setup)(第二步)

(1)基位址,mac位址以及中斷號都用不著,主要是netdev_ops這個結構體,他包含了這個網絡卡支援的操作。

(2)表示回環網絡卡支援的最大的接收資料的包的大小,除了正式資料,還有相關網路協議的頭部分。

dev->mtu          = (16 * 1024) + 20 + 20 + 12;有效資料一般定義為16kb。

struct header_ops ;
6.資料傳送

static int loopback_net_xmit(struct sk_buff *skb,struct net_device *dev)

(1)第乙個引數是協議棧傳送給回環網絡卡的包資料,第二個引數是回環網絡卡的結構體。

(2)停止傳送佇列

通知上層暫停送資料,好讓txd傳送已送達的資料,但是不涉及硬體,所以在回環網絡卡可忽略。相應的,將資料寫入暫存器和喚醒再次傳送以及釋放佇列就可忽略。

(3)資訊統計,表明上層送下來的包的協議

skb->protocol = eth_type_trans(skb, dev);

(4)統計傳送過來的資料大小以及包的個數。

bytes += skb->len;

netif_rx(skb);

7.由於從協議棧來的資料報(skb)存放到txd,而且txd不需要往外傳送,txd和rxd「連」在一起,所以直接在傳送部分呼叫普通網絡卡的接收部分的netif_rx(skb)函式,所以傳送的同時就完成了接收。同時我們更清楚地看到在傳送的時候不能釋放skb,否則沒有可接收的資料。

8.實現獲取網絡卡狀態的函式

static struct net_device_stats *loopback_get_stats(struct net_device *dev)

從這個結構體可以獲取網絡卡狀態資訊

/* the main device statistics structure */

struct rtnl_link_stats64 ;

主要是這四個成員

stats->rx_packets = packets;

stats->tx_packets = packets;

stats->rx_bytes  = bytes;

stats->tx_bytes  = bytes;

。實際上自己可以重寫這個獲取狀態的函式,因為struct net_device *dev有乙個成員就是struct net_device_stats    stats;所以可以在重寫的時候定義乙個struct net_device_stats    stats指向形參傳遞進來的回環網絡卡結構體的stats成員,同樣只需要注意stats成員的上述四個成員即可。

9.在退出該驅動的時候就是取消註冊結構體。達到登出網絡卡的目的。

static __net_exit void loopback_net_exit(struct net *net)

下面為範例**

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* for the statistics structure. */

#include /* for arphrd_ether */

#include #include #include #include #include unsigned long packets = 0;

unsigned long bytes = 0;

//struct net_device *dev;

static __net_exit void loopback_net_exit(struct net *net)

static int loopback_net_xmit(struct sk_buff *skb,struct net_device *dev)

static struct net_device_stats *loopback_get_stats(struct net_device *dev)

static const struct net_device_ops loopback_ops =;/*

* the loopback device is special. there is only one instance

* per network namespace.

*/static void loopback_setup(struct net_device *dev)

/* setup and register the loopback device. */

static int loopback_net_init(struct net *net)

/* registered in net/core/dev.c */

struct pernet_operations __net_initdata loopback_net_ops = ;

linux 網絡卡驅動

如何安裝linux網絡卡驅動呢,看看下面的說明。適用機型 所有xseries 205 所有xseries 206 所有xseries 225 所有xseries 226 所有xseries 235 所有xseries 236 所有xseries 255 所有xseries 305 所有xseries...

國嵌攻略 134 回環網絡卡驅動程式設計

回環網絡卡 loop 回環網絡卡的tx通道和rx通道是直連的,所以資料直接傳送到接收埠。編寫回環網絡卡驅動 回環網絡卡驅動在 driver net loopback.c include include include include include include include string.h ...

雙網絡卡的回環測試

最近碰到這樣乙個問題,一台linux機器上裝有兩個網絡卡,分別為eth0和eth1,將這兩個網絡卡用網線直接連線起來,要進行回環測試,也就是從eth1發資料從eth0收到,從eth0發資料從eth1收到。本來,通過原始套接字,直接繫結到指定的網絡卡上進行接收和傳送資料,是很容易完成任務。但要求是要用...