LwIP的网卡管理
注意netif就是指网卡,即网络接口
netif结构体
之前提到过网卡是硬件接口,LwIP是软件,那么怎么实现让硬件和软件无缝连接一起呢?并且软件如何兼容不同的硬件呢? 在LwIP中使用一个数据结构——netif来描述一个网卡;这是因为网卡多种多样,比如:WiFi、以太网;以及还有各种的以太网的驱动,比如LAN8720。所以LwIP将无法统一的部分进行了抽象;但是底层接口的部分是由用户设置的(初始化、接收、发送函数)。 如果一个设备存在多个网卡,那么LwIP使用netif通过链表的方式将网卡统一管理。
netif解决了硬件接口的差异,对不同网卡的抽象完成同一管理
网卡的数据结构struct netif定义在lwip-x.x.x\src\include\lwip\netif.h

state
state是一个通用指针,通常存放的是网卡各自不同的状态或工作方式。其实就是遵循内核和硬件驱动解耦,只是在当LwIP调用网卡驱动函数时候会传递netif结构体,通过state就可以访问到网卡数据。
MTU:最大传输单元
指网络能够传输的最大数据包大小,以字节为单位。MTU的大小决定了发送端一次能够发送报文的最大字节数。所以一次传送多大的包合适、多大的包最高效是一个核心问题,如果包大小设置的很大,意味着报文中的有效数据也更多,通信效率更高,但传送一个数据包的延迟也越大,数据包中bit位发生错误的概率也越大。并且如果这个报文丢掉了,重传的代价也很大。如果包大小设置的过小,则意味传输相同的数据量,设备需要处理更多的报文,这样会极大的考验设备的线速转发能力。
MTU是链路层的概念,所以不同链路介质类型的网络有不同的默认MTU值

- 为什么以太网的MTU通常为1500? 为了保证CSMA/CD(载波多路复用/冲突检测)机制,所以规定了以太帧长度最小为64字节,最大为1518字节。最小64字节是为了保证最极端的冲突能被检测到,64字节是能被检测到的最小值;最大不超过1518字节是为了防止过长的帧传输时间过长而占用共享链路太长时间导致其他业务阻塞。抛去14字节的头部和4字节的CRC校验尾部正好是1500字节。 什么是MTU
netif_add()
netif_add:是将网卡挂载到netif_list链表上,LwIP是通过链表来管理网卡的,即使只有一个链表也需要挂载。
netif的底层函数
函数路径为lwip-x.x.x\contrib\examples\ethernetif\ethernetif.c
low_level_initlow_level_outputlow_level_inputethernetif_initethernetif_input
这里主要到的是,LwIP对网卡的接收/发送数据使用的是pbuf格式。所以我们需要对数据进行封装。
但是因为网卡直接和硬件打交道,硬件不同则处理的操作也不同,所以必须由用户提供底层接口函数,当LwIP接收到数据时,才会传入内核中处理;同时发送数据也是调用网卡的发送函数
netif就是LwIP抽象出来的网卡,LwIP可以接入多个不同的接口,在ethernetif.c文件中提供了netif访问各种不同的网卡,每个网卡有不同的实现方式,用户只需要修改ethernetif.c即可。
文字描述有局限性,大家可以去看B站本期代码讲解的视频。
相关文章
MAC内核+外部PHY
**** 以太网接入**MCU**方案 以太网接入是嵌入式开发必不开的东西,那么目前主要有两种方式,**“软件TCP/IP协议栈接入以太网方案”**以及**“硬件TCP/IP协议栈以太网接入方案”**。 目前软件TCP/IP协议栈比较广泛。 软件TCP/IP协议栈接入以太网方案 这种以太网接入方案是LwIP+MAC内核+PHY层芯片共同实现的,用于实现以太网的物理...
PHY从物理层到MAC层的核心原理
以太网介绍:从物理层到MAC子层的核心原理 以太网(Ethernet)是当前应用最广泛的局域网技术,因其在组网领域的高占比,常被大众直接等同于“互联网”。实际上,它是遵循**IEEE 802.3标准**构建的局域网技术,核心定义集中在OSI参考模型的**物理层(PHY)** 与**数据链路层的介质访问控制子层(MAC)**,小到学校的PC局域网(用水晶头网线连接),大到企业的局部网络,都以以太网为...
LwIP开发分享(二)—— 三种编程接口
LwIP的三种编程接口 LwIP作为轻量级TCP/IP协议栈,提供了三种不同层级的编程接口,分别是**RAW/Callback API**、**NETCONN API**和**SOCKET API**。这些接口在易用性和执行效率上呈现互补关系:**易用性从左到右依次提高,而执行效率从左到右依次降低**(即最易用的接口牺牲了部分效率)。 一、RAW/Callback API(内核回调接口)...