天天看點

【lwip】03-網絡接口

目錄

前言

3. 網絡接口

3.1 概念引入

3.2 lwip netif 結構體

3.2.1 連結

3.2.2 字段分析

3.2.3 網卡連結清單

3.2.4 網絡 IP

3.2.5 接收資料函數

3.2.6 發送資料函數

3.2.6 ARP 子產品調用的發送函數

3.2.7 出口回調函數

3.2.8 使用者私有資料

3.2.9 最大傳輸機關

3.2.10 鍊路硬體位址長度&位址

3.2.11 網卡資訊狀态标志

3.2.12 網卡名字

3.2.13 網卡辨別

3.3 netif 使用

3.4 與 netif 相關的底層函數

附件-源碼struct netif

李柱明部落格:[https://www.cnblogs.com/lizhuming/p/15487068.html](https://www.cnblogs.com/lizhuming/p/15487068.html)

網絡接口(以太網接口)是硬體接口(網絡接口又可以稱之為網卡)。

LWIP 是軟體那麼而怎樣讓硬體和軟體無縫連接配接起來呢?

而且網卡又多種多樣,怎樣才能讓 LWIP 使用同樣的軟體相容不同的硬體平台?

LWIP 中使用了一個<code>netif</code>結構體來描述網卡但是網卡是直接和硬體平台打交道的:

使用者提供最底層接口函數。

LWIP 提供統一的 API。

舉例:

收:如網卡的初始化和網卡的收發資料,當 LWIP 底層得到資料之後,才會傳入到核心中去處理。

發:LWIP 核心需要發送資料包的時候,也需要調用網卡的發送函數。

LWIP 中的 etherneif.c 檔案的函數通常為硬體打交道的底層函數,當有資料需要通過網卡接收或者發送資料的時候就會被調用,通過 LWIP 的協定棧的内部進行處理後,從應用層就能得到資料或者可以發送資料。

小總結:

簡單來說,netif 是 LWIP 抽象出來的網卡,LWIP 協定棧可以使用多種不同接口,而 etherneif.c 檔案則提供了 netif 通路各種不同的網卡,每個網卡有不同的實方式,每戶隻需要修改 ethernetif.c 檔案即可。

源碼:((20210727163318-nobqihq))

LWIP 使用連結清單來統一管理同一裝置的多個網卡。

netif.c 檔案中定義兩個全局指針 <code>struct netif *netif_list</code> 和 <code>struct netif *netif_default</code>

<code>netif_list</code> 就是網卡連結清單指針,指向網卡連結清單的首節點(第一個網卡)。

<code>netif_default</code> 預設網卡。

<code>ip_addr</code>:網絡中的 IP 位址。

<code>netmask</code>:子網路遮罩。

<code>gw</code>:網關位址。

該函數由網絡裝置驅動程式調用,将資料包傳遞到 TCP/IP 協定棧(IP 層),這通常是 <code>ethernet_input()</code>,參數為 <code>pbuf</code> 和 <code>netif</code> 類型,其中 <code>pbuf</code> 為接收到的資料包。

函數由 IP 層調用,在接口上發送資料包。使用者需要編寫該函數并使 output 指向它。

通這個函數的處理步驟是首先解析硬體位址,然後發送資料包。

對于以太網實體層,該函數通常是 <code>etharp_output()</code>,參數是 <code>pbuf</code>,<code>netif</code>,和 <code>ip_addr</code> 類型。

注意:其中 <code>ipaddr</code> 代表要将資料包發送到的位址,但不一定資料包最終到達的 ip 位址。比如要發送 ip 資料報到一個并不在本網絡的主機上,該資料包要被發送到一個路由器上,這裡的 ipaddr 就是路由器的 ip 位址。

該函數和 <code>output</code> 類似,也需要使用者自己實作一個函數,但是隻有兩個參數,它是由 ARP 子產品調用的,一般是自定義函數 <code>low_level_output()</code>。

當需要在網卡上發送一個資料包時,該函數會被 <code>ethernet_output()</code> 函數調用。

當 netif 被删除時調用此函數。

由裝置驅動程式設定并指向裝置的狀态資訊,主要将網卡的某些私有資料傳遞給上層。

網卡狀态資訊标志位,是很重要的控制字段,它包括網卡的功能使能,廣播使能,ARP 使能等重要控制位。

用于儲存每一個網卡的名字,用兩個字元的名字來辨別。

網卡使用的裝置驅動的種類,名字由裝置驅動來設定并且應該反映通過網卡表示的硬體的種類。

如果兩個網卡具有相同的網絡名字,我們就用 num 字段來區分相同類别的不同網卡。

辨別使用同種驅動類型的不同網卡。

簡要步驟:

定義一個 <code>netif</code> 作為網卡裝置結構體。

挂載到 <code>netif_list</code> 連結清單中。

使用函數:<code>netif_add();</code>

建議參考該函數源碼。

主要 API:

相關 API: