網絡卡驅動程式實踐

2021-08-13 11:01:02 字數 1444 閱讀 8587

一、虛擬網絡卡的實現

在linux系統中,新增乙個網路裝置大致需要以下步驟。

1、分配乙個網路裝置結構體

/*alloc a net_device struct*/

vnet_dev = alloc_netdev(0, "eth%d",ether_setup);

2、註冊這個網路裝置

register_netdev(vnet_dev);
這樣,當安裝上這個驅動程式之後,就在linux系統中有了乙個ethx裝置。在控制台使用

ifconfig -a
命令,就能看到這個裝置。使用

ifconfig ethx up
就可以啟動這個網路裝置。使用

ifconfig ethx 192.168.x.x
就可以給這個裝置分配ip,但是此時的裝置是不能進行資料收發的。還需要對vnet_dev進行具體的設定。

首先,給vnet_dev分配乙個操作結構體,

static struct net_device_ops vnet_dev_ops = 

;

這裡僅僅新增乙個資料報的傳送函式以實現乙個虛擬網絡卡。把這個結構體賦給vnet_dev,這個成員的設定,在不同版本核心是不一樣的,老的核心是設定vnet_dev->hard_start_xmit

vnet_dev->netdev_ops= &vnet_dev_ops;
給網絡卡設定mac位址

vnet_dev->dev_addr[0] = ***;

...vnet_dev->dev_addr[5] = ***;

設定網絡卡裝置的標誌位

vnet_dev->flags           |= iff_noarp;

vnet_dev->features |= netif_f_no_csum;

vnet_send_packet的具體實現

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

static void emulator_rx_packet(struct sk_buff *skb, struct net_device *dev)

這樣,當

ifconfig ethx up

ifconfig ethx 192.168.x.x

後,即能ping同自己的ip位址。

但本身我自己的檔案系統是通過網路掛載的,實際測試網絡卡驅動比較麻煩。先按當前進度,把後續實驗做完,然後再抽時間重寫網絡卡驅動

網絡卡驅動程式

1 網路子系統 如下的核心空間的幾層 使用者空間 應用層 核心空間 系統呼叫 通過socket訪問網路子系統 核心空間 協議無關介面 一組通用函式通過socket訪問不同協議 核心空間 網路協議層 各種傳輸層網路層協議tcp udp ip 核心空間 裝置無關介面 核心空間 裝置驅動 硬體裝置 2 網...

網絡卡驅動程式

我們這裡說的是網絡卡驅動程式,不是網路驅動程式,網路有七層,我們寫的只是最底層的東西,網路這麼多層,但是最終你還是要操作硬體啊 所以上面肯定有個硬體相關層,我們要寫的就是硬體相關的驅動程式這一小塊。網絡卡你不需要開啟什麼裝置,你只需要socket程式設計就行了 怎麼寫1 分配某個結構體 2 設定 3...

網絡卡驅動程式框架

我們這裡說的是網絡卡驅動程式,不是網路驅動程式,網路有七層,我們寫的只是最底層的東西,網路這麼多層,但是最終你還是要操作硬體啊 所以上面肯定有個硬體相關層,我們要寫的就是硬體相關的驅動程式這一小塊。網絡卡你不需要開啟什麼裝置,你只需要socket程式設計就行了 怎麼寫1 分配某個結構體 2 設定 3...