在上一节中,我们已经对LwIp的目录结构有所了解。本文档将对LwIp协议栈进行进一步的研究。重要的源文件解释了LwIp的源代码。有数百个源文件。我们在阅读源码的时候,不能一下子看完。API目录提供了Socket接口和SequentialAPI接口。Socket.c实现了BSDsocket的接口封装。tcpip.c文件没有实现tcpip协议。它实际上是SequentialAPI主线程模块的实现。api_lib.c是SequentialAPI接口的实现。core目录是协议栈的核心。其中tcp.cip.c和udp.c是整个tcp/ip协议栈的核心实现。ip层也分为ipv4和ipv6两个目录,其中包含ipv4和ipv6层。具体实施。mem.c和memp.c是内存管理的核心实现。netif目录是接口部分。最新的2.0版本和原来的1.4版本对Ethernet部分做了较大改动。ethernetif.c为以太网驱动文件,需要根据具体硬件进行移植。ethernetif.c文件在1.4版本是在这个目录下,2.0版本是放在用户目录下。该目录下还有ppp协议等其他接口文件。ethernet.c是以太网数据包的抽象入口-出口函数接口。没有操作系统移植和初始化。将LwIp移植到特定的网卡和操作系统需要一定的工作量。移植LwIp分为操作系统移植和非操作系统移植。操作系统移植比较麻烦。让我们先讨论非操作系统移植。非操作系统移植主要需要移植ethernetif.c文件。网卡的初始化应该在low_level_init函数中进行。low_level_init函数是配置MAC地址和物理网卡的初始化函数。调用过程如下。网卡初始化进程low_level_init设置物理网卡芯片的参数(mac地址、phy模型、mac接口类型、接收模式、自动协商等),并将这些参数写入网卡芯片的寄存器中。物理网卡芯片初始化物理芯片设置好后,就可以接收和发送数据了,但是接收和发送数据的功能需要用LwIp的函数封装,否则不能被LwIp处理。无操作系统和有操作系统的数据接收过程不同。没有操作系统的接收入口函数是ethernetif_input,它将网卡接收到的数据发送给LwIp协议栈。low_level_output函数需要自己实现网卡发送函数。
