当前位置: 首页 > news >正文

lwIP——4 网络接口

1.lwIP网络接口

网络接口(网卡):个人理解是处理网络层数据传输关系的接口(tcp/ip协议栈中的网络接口层部分),直接与硬件平台打交道

lwIP协议栈支持多种不同的网络接口(网卡),由于网卡是直接和硬件平台打交道,硬件不同则处理也是不同的,所以由用户提供最底层的接口函数,lwIP提供统一的接口,但是底层的实现需要用户自己去完成(ethernetif.c) 

在lwIP中每一个网卡都由一个netif 结构体来表示,这些结构体描述了各个网卡的底层实现函数及状态,并以链表形式链接起来 

netif 屏蔽了硬件接口的差异,完成了对不同网络接口的抽象

流程示例(发送数据):

  1. 网络层准备数据:网络层根据上层应用需求,准备好要发送的数据,如组装 IP 数据包等。
  2. 统一接口传递:网络层调用 ethernet.c 中ethernet_output函数,将数据传递到下层。(封装:目的 MAC 地址、源 MAC 地址、帧类型)
  3. netif 结构体处理ethernet_output函数将数据发送给 netif 结构体,netif 结构体对数据进行一些适配处理,为发送到具体物理接口做准备。
  4. 底层文件与物理接口发送:ethernetif.c 的linkoutput函数从 netif 结构体获取数据,按照物理接口(如 WIFI、以太网接口)的要求进行最后的封装等操作,然后通过物理接口将数据发送到网络中。(也就是调用 low_level_output 把 pbuf 数据包拷贝到以太网发送描述符管理的 Buffer 当中,并调用函数 HAL_ETH_TransmitFrame 发送此帧)

 

 


2.lwIP的netif结构体

这些成员变量是根据相关网卡的特性,针对性填写

struct netif { struct netif *next; 				/* 指向下一个节点的指针 */ ip_addr_t ip_addr; 					/* 设置网卡的IP地址、子网页码及网关地址 */ ip_addr_t netmask; ip_addr_t gw; netif_input_fn input; 				/* 指向数据包输入函数 */ netif_output_fn output; 	/* 指向数据包待发送函数 ----检测目标IP地址的MAC地址等操作 */netif_linkoutput_fn linkoutput; 		/* 指向数据包输出函数 */netif_status_callback_fn link_callback; /* 链接状态回调函数 */ void *state; 						/* 虚拟网卡状态 */ u16_t mtu; 						    /* 最大传输单元 */ u8_t hwaddr[NETIF_MAX_HWADDR_LEN]; 	/* 网卡的MAC地址 */ u8_t hwaddr_len; 					/* MAC地址长度 */u8_t flags; 						/* 虚拟网卡的标志符 */ char name[2]; 						/* 网卡的名称 */ /*................*/ };

 


 3. netif 相关函数

lwIP网络接口函数

描述

netif_init()

虚拟网卡初始化(lwip_init()

netif_add()

添加一个虚拟网卡

netif_remove()

移除一个虚拟网卡

netif_set_default()

设置默认虚拟网卡(用于未知的数据包)

…………………..

…………………..

全局变量 struct netif *netif_list:指向该链表表头 

全局变量 struct netif *netif_default:指向的netif结构所表示的网卡为缺省网卡。(在发送消息的时候,会首先会通过这个网卡,若是没有回应,再使用其他网卡)

3.1 netif_add()函数

struct netif *netif_add( struct netif    *netif,const ip4_addr_t    *ipaddr,const ip4_addr_t    *netmask,const ip4_addr_t    *gw,void    *state,netif_init_fn    init,netif_input_fn    input){// 清空网络接口的 IP 地址、子网掩码和网关地址信息,将其初始化为零ip_addr_set_zero_ip4(&netif->ip_addr);ip_addr_set_zero_ip4(&netif->netmask);ip_addr_set_zero_ip4(&netif->gw);// 将网络接口的输出函数初始化为空 IP4 输出函数,作为默认的输出处理方式netif->output = netif_null_output_ip4;// 初始化网络接口的最大传输单元(MTU)为 0,MTU 表示该网络接口一次能传输的最大数据长度netif->mtu = 0;// 初始化网络接口的标志位为 0,标志位可用于表示网络接口的各种状态netif->flags = 0;// 将网络接口的客户端数据数组清零,客户端数据可用于存储用户自定义的与该网络接口相关的数据memset(netif->client_data, 0, sizeof(netif->client_data));// 将用户传入的自定义状态数据指针赋值给网络接口的 state 字段,方便后续使用netif->state = state;// 为当前网络接口分配一个唯一的编号,netif_num 可能是一个全局变量用于记录网络接口编号netif->num = netif_num;// 将用户传入的网络接口输入处理函数指针赋值给网络接口的 input 字段,用于处理接收到的数据包netif->input = input;// 调用 netif_set_addr 函数设置网络接口的 IP 地址、子网掩码和网关地址// 如果传入的参数为 NULL,则保持之前清零时的零值netif_set_addr(netif, ipaddr, netmask, gw);// 调用用户提供的网络接口初始化函数对网络接口进行进一步的初始化操作// 如果初始化函数返回值不为 ERR_OK,表示初始化失败if (init(netif) != ERR_OK) {// 初始化失败,返回 NULL 表示网络接口添加失败return NULL;}// 将当前网络接口添加到全局网络接口列表的头部// 先将当前网络接口的 next 指针指向原来的网络接口列表头netif->next = netif_list;// 再将全局网络接口列表头指针指向当前网络接口,完成添加操作netif_list = netif;// 调用 mib2_netif_added 函数,该函数可能用于更新 MIB(管理信息库)相关信息,以反映新网络接口的添加mib2_netif_added(netif);// 调用 netif_invoke_ext_callback 函数触发网络接口添加的外部回调函数// 通知其他模块网络接口已成功添加netif_invoke_ext_callback(netif, LWIP_NSC_NETIF_ADDED, NULL);// 网络接口添加成功,返回指向该网络接口结构体的指针return netif;
}

 

3.2 netif_set_default() 函数

该函数就是设置某一个 netif 结构体为默认的网卡

// 定义 netif_set_default 函数,用于设置默认网络接口
void netif_set_default(struct netif *netif) {if (netif == NULL) {/* 删除默认路由 */mib2_remove_route_ip4(1, netif);} else {/* 添加默认路由 */mib2_add_route_ip4(1, netif);}// 选择指定的网络接口作为默认网络接口netif_default = netif; 
}// 以下是使用 netif_set_default 函数的示例代码
int main() {struct netif xnetif;ip4_addr_t ipaddr, netmask, gw;// 假设这里初始化 IP 地址、子网掩码和网关地址// 例如:IP4_ADDR(&ipaddr, 192, 168, 1, 100);IP4_ADDR(&netmask, 255, 255, 255, 0);IP4_ADDR(&gw, 192, 168, 1, 1);// 通过 netif_add 函数,将网络接口添加到链表中netif_add(&xnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &tcpip_input);// 注册默认的网络接口netif_set_default(&xnetif);return 0;
}

相关文章:

lwIP——4 网络接口

1.lwIP网络接口 网络接口(网卡):个人理解是处理网络层和数据传输关系的接口(tcp/ip协议栈中的网络接口层部分),直接与硬件平台打交道 lwIP协议栈支持多种不同的网络接口(网卡)&#…...

pytest自动化测试 - pytest夹具的基本概念

<< 返回目录 1 pytest自动化测试 - pytest夹具的基本概念 夹具可以为测试用例提供资源(测试数据)、执行预置条件、执行后置条件&#xff0c;夹具可以是函数、类或模块&#xff0c;使用pytest.fixture装饰器进行标记。 1.1 夹具的作用范围 夹具的作用范围&#xff1a; …...

FreeRtos的使用教程

定义&#xff1a; RTOS实时操作系统, (Real Time Operating System), 指的是当外界事件发生时, 能够有够快的响应速度,调度一切可利用的资源, 控制实时任务协调一致的运行。 特点&#xff1a; 支持多任务管理&#xff0c; 处理多个事件&#xff0c; 实现更复杂的逻辑。 与计算…...

yolov11 解读简记

1 文章详细介绍了YOLOv11的架构设计&#xff0c;包括以下几个关键组件&#xff1a; C3k2块&#xff1a;这是YOLOv11引入的一种新型卷积块&#xff0c;替代了之前版本中的C2f块。C3k2块通过使用两个较小的卷积核代替一个大的卷积核&#xff0c;提高了计算效率&#xff0c;同时保…...

实验二 数据库的附加/分离、导入/导出与备份/还原

实验二 数据库的附加/分离、导入/导出与备份/还原 一、实验目的 1、理解备份的基本概念&#xff0c;掌握各种备份数据库的方法。 2、掌握如何从备份中还原数据库。 3、掌握数据库中各种数据的导入/导出。 4、掌握数据库的附加与分离&#xff0c;理解数据库的附加与分离的作用。…...

Kafka常见问题之 `javax.management.InstanceAlreadyExistsException`

文章目录 Kafka常见问题之 javax.management.InstanceAlreadyExistsException1. 概述2. 常见原因3. 具体异常示例4. 解决方案4.1 确保单一 Kafka Producer 实例4.2 配置 Kafka Broker 和 Producer 使用唯一的 JMX 名称&#xff08;对于Producer重点检查 client.id&#xff09;4…...

性能测试丨JVM 性能数据采集

什么是JVM性能数据采集&#xff1f; JVM性能数据采集是指通过一些工具和技术采集与Java虚拟机相关的性能数据。这些数据包括但不限于内存使用、CPU使用、垃圾回收&#xff08;GC&#xff09;行为、线程活动等。合理地分析这些数据&#xff0c;可以帮助我们找出系统的瓶颈&…...

计算机图形学实验练习(实验1.2-4.1AND补充实验12)

实验1.2 OpenGL与着色器编程 1.理论知识 1.1 OpenGL的含义 OpenGL是一种应用程序编程接口(Application Programming Interface,API),它是一种可以对图形硬件设备特性进行访问的软件库。OpenGL最新的4.3版本包含了超过500个不同的命令,可以用于设置所需的对象、图像和操…...

JWT实现单点登录

文章目录 JWT实现单点登录JWT 简介存在问题及解决方案登录流程后端程序实现前端保存Tokenstore存放信息的缺点及解决 校验流程&#xff1a;为gateway增加登录校验拦截器 另一种单点登录方法&#xff1a;Token&#xff0b;Redis实现单点登录 JWT实现单点登录 登录流程&#xff…...

云计算的概念与特点:开启数字化时代的新篇章

在当今数字化时代,云计算(Cloud Computing)已经成为推动技术创新和业务转型的核心力量。无论是大型企业、中小型企业,还是个人用户,云计算都为其提供了高效、灵活和经济的解决方案。本文将深入探讨云计算的概念及其核心特点,帮助读者全面了解这一革命性技术。 © ivw…...

salesforce中如何获取一个profile的18位id

在 Salesforce 中&#xff0c;要获取一个 Profile 的 18 位 ID&#xff0c;可以通过以下几种方式实现&#xff1a; 方法 1&#xff1a;通过 Developer Console 登录 Salesforce。 点击右上角的 头像 或 设置齿轮&#xff0c;选择 “开发者控制台”&#xff08;Developer Conso…...

Vue 3 中的标签 ref 与 defineExpose:模板引用与组件暴露

在 Vue 3 中&#xff0c;ref 不仅可以用于创建响应式数据&#xff0c;还可以用于获取 DOM 节点或组件实例。通过 ref&#xff0c;我们可以直接访问模板中的元素或组件&#xff0c;并在需要时操作它们。此外&#xff0c;defineExpose 用于在 <script setup> 语法中显式暴露…...

FLTK - FLTK1.4.1 - demo - adjuster.exe

文章目录 FLTK - FLTK1.4.1 - demo - adjuster.exe概述笔记根据代码&#xff0c;用fluid重建一个adjuster.fl 备注 - fluid生成的代码作为参考代码好了修改后可用的代码END FLTK - FLTK1.4.1 - demo - adjuster.exe 概述 想过一遍 FLTK1.4.1的demo和测试工程&#xff0c;工程…...

单路由及双路由端口映射指南

远程登录总会遇到登陆不上的情况&#xff0c;可能是访问的大门没有打开哦&#xff0c;下面我们来看看具体是怎么回事&#xff1f; 当软件远程访问时&#xff0c;主机需要两个条件&#xff0c;一是有一个唯一的公网IP地址&#xff08;运营商提供&#xff09;&#xff0c;二是开…...

专为课堂打造:宏碁推出三款全新耐用型 Chromebook

IT之家 1 月 25 日消息&#xff0c;宏碁&#xff08;Acer&#xff09;昨日&#xff08;1 月 24 日&#xff09;发布公告&#xff0c;针对教育市场&#xff0c;推出 Chromebook Spin 512 (R857T)、Chromebook Spin 511 (R757T) 和 Chromebook 511 (C737) 三款产品&#xff0c;兼…...

云计算架构学习之LNMP架构部署、架构拆分、负载均衡-会话保持

一.LNMP架构部署 1.1. LNMP服务搭建 1.磁盘信息 2.内存 3.负载信息 4.Nginx你们公司都用来干嘛 5.文件句柄(文件描述符 打开文件最大数量) 6.你处理过系统中的漏洞吗 SSH漏洞 7.你写过什么shell脚本 8.监控通过什么告警 zabbix 具体监控哪些内容 9.mysql redis查询 你好H…...

Python案例--暂停与时间格式化

在编程中&#xff0c;时间的处理是一个常见的需求。无论是日志记录、任务调度还是数据时间戳的生成&#xff0c;正确地获取和格式化时间都至关重要。Python 提供了强大的时间处理模块&#xff0c;其中 time 模块是基础且广泛使用的工具之一。本文将通过一个简单的示例&#xff…...

【javaweb项目idea版】蛋糕商城(可复用成其他商城项目)

该项目虽然是蛋糕商城项目&#xff0c;但是可以复用成其他商城项目或者购物车项目 想要源码的uu可点赞后私聊 技术栈 主要为&#xff1a;javawebservletmvcc3p0idea运行 功能模块 主要分为用户模块和后台管理员模块 具有商城购物的完整功能 基础模块 登录注册个人信息编辑…...

git gui 笔记

这里写目录标题 1. [下载安装git](https://blog.csdn.net/jiesunliu3215/article/details/111559125)2. [下载Git Gui](https://git-scm.com/downloads)3. 上传下载代码4. 创建版本5. 版本切换-checkout参考狂神说 git教程 -讲的是真的好gitee的git帮助 其他 1. 下载安装git 2…...

使用 Docker 运行 Oracle Database 23ai Free 容器镜像并配置密码与数据持久化

使用 Docker 运行 Oracle Database 23ai Free 容器镜像并配置密码与数据持久化 前言环境准备运行 Oracle Database 23ai Free 容器基本命令参数说明示例 注意事项高级配置参数说明 总结 前言 Oracle Database 23ai Free 是 Oracle 提供的免费版数据库&#xff0c;基于 Oracle …...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...