一、虛擬網絡卡的實現
在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...