LWIP网络接口管理
主要内容参照4. LwIP的网络接口管理 — [野火]LwIP应用开发实战指南—基于野火STM32 文档,整理出来自用。
1、netif概念(应用层虚拟的网卡实例对象)
理解网络接口重点理解netif,netif是LwIP抽象出来的网卡,LwIP协议栈可以使用多个不同的接口,而ethernetif.c文件则提供了netif访问各种不同的网卡,每个网卡有不同的实现方式,用户只需要修改ethernetif.c文件即可。当一个设备中有多个网卡,LwIP会将每个用netif描述的网卡连接成一个链表(单向链表),该链表就记录每个网卡的netif。
2、 netif的应用流程
注册初始化接口(netif_add()
)——>配置接口属性(地址网关等)——>启用接口(netif_set_up(netif))
3、挂载网卡
如果一个设备当前是还没有网卡的,当调用netif_add()函数挂载网卡后,其过程如图1所示,当设备需要挂载多个网卡的时候, 就多次调用netif_add()函数即可,新挂载的网卡会在链表的最前面,具体见图2。
4、low_level_init/inoutput(硬件实际交互的对象)
low_level_init
通常是在网络接口初始化函数(如 ethernetif_init
)中被调用,是硬件相关初始化的具体实现。它的核心职责是:
- 初始化网络硬件寄存器(如 MAC 控制器、PHY 芯片等)
- 配置硬件工作模式(如速率、双工模式)
- 初始化发送 / 接收缓冲区
- 使能硬件中断(用于数据接收和发送完成通知)
low_level_init()为网卡初始化函数,它主要完成网卡的复位及参数初始化,根据实际的网卡属性进行配置netif中与网卡相关的字段,例如网卡的MAC地址、长度,最大发送单元等。
low_level_output()函数为网卡的发送函数,它主要将内核的数据包发送出去,数据包采用pbuf数据结构进行描述,该数据结构是一个比较复杂的数据结构,后续我们会详细讲解。
low_level_input()函数为网卡的数据接收函数,该函数会接收一个数据包,为了内核易于对数据包的管理,该函数必须将接收的数据封装成pbuf的形式。