11 網路裝置驅動介紹

2021-09-01 02:52:57 字數 4565 閱讀 5763

** 朱老師物聯網大講堂

《linux驅動開發-第11部分-5.11.網路裝置驅動介紹》

第一部分、章節目錄

5.11.1.網路裝置驅動概述

5.11.2.虛擬網絡卡驅動分析1

5.11.3.虛擬網絡卡驅動分析2

5.11.4.dm9000驅動原始碼分析1

5.11.5.dm9000驅動原始碼分析2

第二部分、章節介紹

5.11.1.網路裝置驅動概述

本節對網路裝置驅動做個概要描述,主要是講了這種驅動模型和字元裝置塊裝置的區別,最後講了下本部分的學習方法。

5.11.2.虛擬網絡卡驅動分析1

本節來分析乙個簡化編寫的虛擬網絡卡的驅動原始碼,主要目的是對網路裝置驅動的框架進行理解和分析。

5.11.3.虛擬網絡卡驅動分析2

本節來分析乙個簡化編寫的虛擬網絡卡的驅動原始碼,主要目的是對網路裝置驅動的框架進行理解和分析。

5.11.4.dm9000驅動原始碼分析1

本節來分析dm9000這個真實硬體網絡卡的驅動原始碼,並沒有詳細分析硬體操作,主要是驗證網路裝置驅動框架,並且將之前課程中學到的一些技巧運用進來。

5.11.5.dm9000驅動原始碼分析2

本節來分析dm9000這個真實硬體網絡卡的驅動原始碼,並沒有詳細分析硬體操作,主要是驗證網路裝置驅動框架,並且將之前課程中學到的一些技巧運用進來。

第三部分、隨堂記錄

5.11.1.網路裝置驅動概述

5.11.1.1、什麼是網路裝置

(1)網路裝置

(2)物理網絡卡: 真正的硬體網絡卡裝置

5.11.1.2、網路裝置介面

(1)/dev下沒有裝置檔案,也不通過/sys下的屬性檔案訪問。直**來,應用層都是通過一些特殊的命令(如ifconfig、ping等)來訪問網絡卡硬體(呼叫驅動)的。本質上應用呼叫驅動的方法可以通過分析ping、ifconfig等命令的實現來得知。實際就是通過:socket、bind、listen、connect、send、recv等api來實現的。

(2)網路裝置被抽象成乙個能夠傳送和接收資料報的「網路介面」

(3)struct net_device來管理所有網路介面

5.11.1.3、學習方法

(1)注意網路裝置的訪問方法和前兩種不同

(2)2個資料結構(net_device和sk_buff)

(3)乙個虛擬網絡卡案例**分析 + dm9000驅動原始碼分析

5.11.2.虛擬網絡卡驅動分析1

5.11.2.1、虛擬網絡卡安裝、解除安裝、開啟、關閉、設定ip位址等實踐

5.11.2.2、**分析

#include

#include

#include

/* printk() */

#include

/* kmalloc() */

#include

/* error codes */

#include

/* size_t */

#include

/* mark_bh */

#include

#include

/* struct device, and other headers */

#include

/* eth_type_trans */

#include

/* struct iphdr */

#include

/* struct tcphdr */

#include

#include

#include

#include

#include

#include

// 如果需要隨機mac位址則定義該巨集

#define mac_auto

static

struct net_device *astonnet_devs;

//網路裝置結構體,作為net_device->priv

struct astonnet_priv

;//網路介面的開啟函式

intastonnet_open

(struct net_device *dev)

intastonnet_release

(struct net_device *dev)

//接包函式

void

astonnet_rx

(struct net_device *dev,

int len,

unsigned

char

*buf)

skb_reserve

(skb,2)

;/* align ip on 16b boundary */

memcpy

(skb_put

(skb, len)

, buf, len)

;//skb_put是把資料寫入到socket buffer

/* write metadata, and then pass to the receive level */

skb->dev = dev;

skb->protocol =

eth_type_trans

(skb, dev)

;//返回的是協議號

skb->ip_summed = checksum_unnecessary;

//此處不校驗

priv->stats.rx_packets++

;//接收到包的個數+1

priv->stats.rx_bytes +

= len;

//接收到包的長度

printk

("astonnet rx \n");

netif_rx

(skb)

;//通知核心已經接收到包,並且封裝成socket buffer傳到上層

return;}

//真正的處理的傳送資料報

//模擬從乙個網路向另乙個網路傳送資料報

void

astonnet_hw_tx

(char

*buf,

int len,

struct net_device *dev)

dest = astonnet_devs;

priv =

(struct astonnet_priv *

)dest->ml_priv;

//目標dest中的priv

priv->rx_packetlen = len;

priv->rx_packetdata = buf;

printk

("astonnet tx \n");

dev_kfree_skb

(priv->skb);}

//發包函式

intastonnet_tx

(struct sk_buff *skb,

struct net_device *dev)

len = skb->len < eth_zlen ? eth_zlen : skb->len;

//eth_zlen是所發的最小資料報的長度

data = skb->data;

//將要傳送的資料報中資料部分

priv->skb = skb;

astonnet_hw_tx

(data, len, dev)

;//真正的傳送函式

return0;

}//裝置初始化函式

intastonnet_init

(struct net_device *dev)

static

const

struct net_device_ops astonnet_netdev_ops =

;static

void

aston_plat_net_release

(struct device *dev)

static

int __devinit aston_net_probe

(struct platform_device *pdev)

static

int __devexit aston_net_remove

(struct platform_device *pdev)

//裝置移除介面

static

struct platform_device aston_net=,}

;static

struct platform_driver aston_net_driver =,}

;static

int __init aston_net_init

(void

)static

void __exit aston_net_cleanup

(void

)module_init

(aston_net_init)

;module_exit

(aston_net_cleanup)

;module_license

("gpl"

);

5.11.3.虛擬網絡卡驅動分析2

5.11.4.dm9000驅動原始碼分析1

5.11.5.dm9000驅動原始碼分析2

7 網路裝置和分層

在現在的計算機網路中,都是需要依靠網路裝置來進行網路通訊的,通過參照osi通訊模型將計算機通訊程序劃分層,然後根據網路裝置在計算機通訊過程中的作用,我們可以知道不同的網路裝置工作在不同的層。比如我們最常見的網路裝置 路由器和交換機,集線器等。對於路由器裝置來說,路由器主要的功能是進行路由定址和資料 ...

三 網路裝置 沐梓瓊

q1 如何將兩個主機連起來?a1 網線 網絡卡 協議棧 網線提供物理介質,承載位元流 電訊號 網絡卡進行資料處理,將磁碟上的資料與網線上的位元流進行轉換 協議棧作為溝通語言,實現通訊過程中的資料解析,位址定址 流控制 q2 網線不夠長怎麼辦?a2 中繼器 中繼器是一種物理層產品,能對資訊進行中繼和放...

linux網路裝置驅動

linux網路裝置驅動 linux網路驅動程式的體系結構可劃分為4個層次。linux核心源 中提供了網路裝置介面及以網路子系統的上層的 移植特定網路硬體的驅動程式的主要工作就是完成裝置驅動功能層的相應 根據底層具體的硬體特性,定義網路裝置介面struct net device型別的結構體變數,並實現...