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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…