ethernet_input到應用層處理簡單分析

1、驅動層:從硬件讀取數據并構造pbuf

中斷觸發后,驅動層的接收任務(或輪詢函數)會從網卡硬件讀取數據,并將其封裝為 LWIP 可識別的pbuf結構體(LWIP 的數據緩沖區)。

  • 關鍵函數

    • 驅動自定義的接收函數(如eth_rx_task):負責從網卡寄存器或 DMA 緩沖區讀取原始數據。
    • pbuf_alloc:分配pbuf緩沖區,用于存儲接收到的數據幀。

    示例:

    void eth_rx_task(void *arg) {struct netif *netif = (struct netif *)arg;while (1) {// 等待中斷通知(信號量)sys_sem_wait(&eth_rx_sem, 0);// 從網卡讀取數據長度和內容uint8_t *data = eth_hw_read(&len);// 分配pbuf并復制數據struct pbuf *p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);if (p != NULL) {memcpy(p->payload, data, len);// 調用netif的linkoutput對應的接收回調(見步驟3)netif->input(p, netif);  // 核心:將數據送入協議棧}}
    }
    

2. 調用input函數:進入 LWIP 協議棧

驅動層構造好pbuf后,會直接調用netif->input(p, netif),將數據幀送入協議棧。對于以太網,input被賦值為ethernet_input,其作用是解析以太網幀頭,根據協議類型(如 IP、ARP)分發到對應模塊。

  • ethernet_input的核心邏輯

    err_t ethernet_input(struct pbuf *p, struct netif *netif) {struct eth_hdr *ethhdr;// 提取以太網幀頭(目的MAC、源MAC、協議類型)ethhdr = (struct eth_hdr *)p->payload;// 根據協議類型分發:switch (htons(ethhdr->type)) {case ETHTYPE_IP:// 移除以太網幀頭,將IP數據報送入IP層pbuf_remove_header(p, sizeof(struct eth_hdr));return ip4_input(p, netif);  // 進入IP層處理case ETHTYPE_ARP:// ARP報文交給ARP模塊處理return arp_input(p, netif);default:pbuf_free(p);return ERR_OK;}
    }
    
  • 后續流程

    • IP 層(ip4_input)會解析 IP 頭,根據協議字段(如 TCP、UDP)將數據傳遞到傳輸層。
    • 最終數據會通過socket接口或回調函數交付給應用層。

3、初始化關聯:input函數

input函數在網絡接口初始化時被綁定,具體是在調用netif_add時指定的,流程如下:

  1. 應用層調用netif_add
    第三個參數input通常傳入ethernet_input(以太網):

    struct netif eth_netif;
    netif_add(&eth_netif, &ipaddr, &netmask, &gw, NULL, eth_init, ethernet_input);
    
  2. netif_add函數內部賦值
    netif_add中,將傳入的input函數指針保存到netif結構體:

    netif->input = input;  // input即ethernet_input
    
  3. 驅動層調用netif->input
    如步驟 2 的eth_rx_task所示,驅動接收數據后,通過netif->input(p, netif)觸發協議棧處理。

4、關鍵接口總結

環節核心函數 / 變量作用
硬件中斷eth_isr觸發數據接收事件,通知驅動層
驅動層數據讀取eth_rx_task(自定義)從硬件讀取數據,構造pbuf
協議棧入口netif->input指向ethernet_input,作為數據入口點
以太網幀解析ethernet_input(LWIP 提供)解析以太網幀,分發到 IP/ARP 模塊
網絡層處理ip4_input處理 IP 數據報,傳遞到傳輸層

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93605.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93605.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93605.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#WPF實戰出真汁05--左側導航

1、左側導航設計要點清晰的信息架構 確保導航結構層次分明,主分類與子分類邏輯清晰,避免過度嵌套。使用分組、縮進或分隔線區分不同層級,保持視覺可讀性。直觀的圖標與標簽 為每個導航項搭配簡潔的圖標,強化視覺識別。標簽文字需簡…

大模擬 Major

題目來源:2025 Wuhan University of Technology Programming Contest 比賽鏈接:Dashboard - 2025 Wuhan University of Technology Programming Contest - Codeforces 題目大意: 模擬 16 支隊伍的瑞士輪比賽結果,規則太多&…

【手撕JAVA多線程】1.從設計初衷去看JAVA的線程操作

目錄 前言 概述 主動阻塞/喚醒 代碼示例 實現 為什么必須在同步塊中使用 計時等待是如何實現的 被動阻塞/喚醒 為什么要有被動阻塞/喚醒 實現(鎖升級) 前言 JAVA多線程相關的內容很多很雜,但工作中用到的頻率不高,用到…

UE5多人MOBA+GAS 46、制作龍卷風技能

文章目錄創建龍卷風GA創建蒙太奇創捷一系列GE添加數據表添加到角色中創建龍卷風GA GA_Tornado 添加標簽 // 龍卷風冷卻CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_Tornado_Cooldown)// 通用技能傷害CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_Generic_Dama…

如何在ubuntu下安裝libgpiod庫

以下是關于如何在ubuntu下安裝libgpiod庫的兩種安裝方式以及遇到ubuntu存在多個工具鏈導致編譯失敗的解決方法。如果想要自由選擇使用不同版本的libgpiod,可以選擇手動編譯安裝方式,系統安裝默認1.6.3版本(ubuntu22.04)。手動編譯安裝1、在github上下載要…

qt vs2019編譯QXlsx

1、安裝ActivePerl2、打開pro文件,直接編譯即可第一個簡單實例:#include "xlsxcellrange.h" #include "xlsxchart.h" #include "xlsxchartsheet.h" #include "xlsxdocument.h" #include "xlsxrichstring.h…

計算機存儲器分類和層次結構詳解

存儲器是計算機系統的核心部件之一,其核心功能是存儲程序(指令)和數據,是馮諾依曼體系結構“存儲程序”概念的物質基礎。它直接關系到計算機系統的性能、容量和成本。 存儲器核心內容總覽表分類維度存儲器層級技術實現速度容量成本…

通過rss訂閱小紅書,程序員將小紅書同步到自己的github主頁

title: 通過rss訂閱小紅書,程序員將小紅書同步到自己的github主頁 tags: 個人成長 categories:雜談最近在做一些新的嘗試,把文本的內容轉化為漫畫和圖片,方便大眾閱讀,恰好小紅書很適合分發這些內容,于是我開通了小紅書…

麒麟KylinOS V10-SP3 安裝FastGPT

1. 操作系統環境CPU:20核 Xeon(R) Platinum 8457C 內存:64GB GPU:4090 操作系統:KylinOS-V10-SP32. 安裝docker、docker-compose、fastgpt下載安裝docker、docker-compose1. 下載docker docker 下載地址: https://do…

前端/在vscode中創建Vue3項目

Contenthtml input元素添加css樣式使用js添加交互按鈕點擊提示輸入框字符計數使用 npm 來管理項目包安裝 Node.js初始化項目安裝依賴包創建一個基于 Vite 的 Vue 項目創建項目進入項目目錄安裝依賴調用代碼格式化工具啟動開發服務器在瀏覽器中訪問html input元素 <input ty…

HiSmartPerf使用WIFI方式連接Android機顯示當前設備0.0.0.0無法ping通!設備和電腦連接同一網絡,將設備保持亮屏重新嘗試

在使用HiSmartPerf使用WIFI方式連接Android機時&#xff0c;如果出現無法ping通0.0.0.0的情況&#xff0c;可以嘗試以下步驟解決問題&#xff1a;問了一下AI&#xff0c;給出的解答如下&#xff1a; 檢查網絡連接 &#xff1a;確保設備和電腦連接到同一局域網的Wi-Fi。可以在手…

SpringWeb是什么東西?

SpringWeb是個什么東西&#xff1f;SpringWeb是一個Java開發Web項目時的Web層框架。所謂Web層&#xff0c;就是直接和用戶打交道的框架&#xff0c;用戶(User)也就是顧客&#xff0c;顧客就是上帝&#xff0c;我們說是Web項目&#xff0c;通常也就是說B/S架構的項目&#xff0c…

docker+nginx+keepalived+openappsec+web ui+crowdsec部署安全代理

docker+nginx+keepalived+openappsec+web ui+crowdsec部署安全代理 一、環境介紹 二、基礎環境安裝 1、優化系統參數 2、安裝docker 3、創建容器網絡 4、安裝測試容器(可選) 三、安裝nginx 1、拉取鏡像 2、創建映射目錄 3、準備默認配置文件 4、證書文件準備 5、啟動nginx容器…

自動駕駛中安全相關機器學習功能的可靠性定義方法

摘要當前標準無法涵蓋高自動化駕駛中基于機器學習功能的安全需求。由于神經網絡的不透明性&#xff0c;一些自動駕駛功能無法按照 V 模型進行開發。這些功能需要對標準進行擴展。本文聚焦這一空白&#xff0c;為這類功能定義了功能可靠性&#xff0c;以幫助未來的標準控制基于機…

css實現圓角+邊框漸變+背景半透明

ui小姐姐經常搞一些花里胡哨的東西&#xff0c;圓角邊框漸變背景半透明&#xff0c;雖然每個都可以弄&#xff0c;但是合在一起真的不好弄&#xff0c;主要是因為通過border–image設置的邊框漸變&#xff0c;無法使用圓角&#xff0c;下面是自己搜索整理的一些可以的方案。 方…

tree組件(幾種不同分叉樹Vue3)

效果圖&#xff1a; 基礎樹組件&#xff08;本人博客里面有&#xff09; https://blog.csdn.net/xfy991127/article/details/140346861?spm1001.2014.3001.5501 下面是工作需求改造后 父組件 <template><div class"go-JJTree" id"tree-scroll&quo…

百度智能云x中科大腦:「城市智能體」如何讓城市更會思考

近日&#xff0c;2025中關村論壇系列活動——中關村人工智能與未來城市論壇在中關村國家自主創新示范區展示中心舉辦。論壇上&#xff0c;發布了應用范式創新升級成果、智能體產品、可信數據空間成果等。 中科大腦聯合百度智能云等伙伴共同打造并發布21個智能體產品&#xff0c…

在職老D滲透日記day16:sqli-labs靶場通關(第24關)二次注入 sqlmap自動注入沒跑出來。。。

5.24.2.sqlmap自動注入第一個&#xff1a;登錄頁面&#xff08;1&#xff09;pb抓取http頭POST /sqli-labs/Less-24/login.php HTTP/1.1 Host: 192.168.10.106 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:141.0) Gecko/20100101 Firefox/141.0 Accept: text/ht…

Fanuc機器人EtherCAT通訊配置詳解

1、EtherCAT簡介EtherCAT&#xff0c;這一基于以太網的現場總線系統&#xff0c;以其開放架構和高速性能著稱。CAT代表的是控制自動化技術&#xff08;Control Automation Technology&#xff09;的縮寫&#xff0c;彰顯了其在工業自動化領域的核心地位。作為確定性的工業以太網…

超酷炫的Three.js示例

今天寫一個超級酷炫的Three.js示例&#xff0c;以下是文件源代碼&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-sca…