網絡卡驅動程式框架

2021-07-29 20:04:45 字數 2842 閱讀 7243

我們這裡說的是網絡卡驅動程式,不是網路驅動程式,網路有七層,我們寫的只是最底層的東西,網路這麼多層,但是最終你還是要操作硬體啊

所以上面肯定有個硬體相關層,我們要寫的就是硬體相關的驅動程式這一小塊。

網絡卡你不需要開啟什麼裝置,你只需要socket程式設計就行了

怎麼寫1、分配某個結構體

2、設定

3、註冊

4、硬體相關的操作

然而這個重點在設定這裡

首先你得提供發包函式 提供收包的功能

我們隨便看乙個網絡卡驅動程式 如cs89x0.c

這是乙個真實的網絡卡驅動程式

分配乙個net_device

然後呼叫了下面這個函式

進去有個這個

我們看看net_ops

有open和stop函式

還有ndo_start_xmit 硬體啟動傳輸,這個發包函式就在這裡

然後註冊這個結構體

但是收到資料之後做什麼事情,你怎麼告訴我收到資料了呢,肯定會有個中斷

我們來看看

假設收到資料之後

net_rx 進去看一下

從晶元裡面讀出來

分配乙個skbuf

然後用下面的函式上報

然後我們再看一下發包函式是怎麼回事

它發的是什麼東西,它的引數是怎樣,它的引數是sk_buf

從這裡我們可以知道,硬體相關的這層和上層怎麼打交道呢?

它們之間就是通過sk_buf,上面這幾層構造好包之後,放到sk_buf裡面扔給你,呼叫你的發包函式,你收到資料之後,在你的中斷程式收到資料之後,你從晶元裡面把資料讀出來,構造乙個sk_buf,然後用netif_rx來上報這個資料給我

說到這塊,寫乙個網絡卡驅動很簡單,我們先寫乙個虛擬的網絡卡

參考/driver/net/cs89x0.c

框架如圖

我們來看一下範例裡面分配的

但是我們不想用alloc_etherdev這個巨集,我們進去看一下這個巨集

進入alloc_etherdev_mqs這個函式裡面去

這裡的名字用的是eth0啊 eth1這種,我不想用這個名字,我想換乙個名字,所以我們直接用alloc_netdev_mqs這個函式來做

我們寫乙個最簡單的網路驅動 **如下

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include a

#include

static struct net_device *vnet_dev;

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

static const struct net_device_ops gh_netdev_ops = ;

static int virtnet_init(void)

static void virtnet_exit(void)

module_init(virtnet_init);

module_exit(virtnet_exit);

module_license("gpl");

module_author("eight");

測試如下

1.insmod virt_net.ko

2.ifconfig ghnet0 3.3.3.3

3.ping 3.3.3.3

效果如圖

ping 自己是不會進入那個發包的函式的,我們ping下別人 3.3.3.4

效果如圖

這上面說我發了20個包 

我們ifconfig來看一下

但是我們這裡寫的發的包是0,因為我們**中還沒有設定統計資訊

在我們net_device結構體中有個net_device_stats這個結構體就是統計資訊

網絡卡驅動程式

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

網絡卡驅動程式

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

網絡卡驅動程式實踐

一 虛擬網絡卡的實現 在linux系統中,新增乙個網路裝置大致需要以下步驟。1 分配乙個網路裝置結構體 alloc a net device struct vnet dev alloc netdev 0,eth d ether setup 2 註冊這個網路裝置 register netdev vne...