LWIP_简记(1.不得不说一下目录结构)

LWIP一句话记住就行:
一项工程,两份配置,三种内存分配,四套操作API,五步初始化,六个"数据流",七个数据结构
-------------------------------------------

当然

啦不失一般性,我也会简单讲一下LWIP的目录结构,点到为止,毕竟一开始还是面对初学者,没必要整有些没的,吓到了不好.或者一些大神原本看都看到吐了的东西,再看浪费时间,扫一眼就够了.
我呢,全系列以最新的2.0.0及以上开始整.
小白请自觉跳转这篇博文(https://blog.csdn.net/ZCShouCSDN/article/details/79229728).
先整张图:
lwip源码
可怕不......

再来看看我准备的

LWIP-2.0.3
│ CHANGELOG // 版本更新记录,从中可以看到 LwIP 不同版本的变化
│ COPYING // 版权说明
│ FILES // 其中说明了其所在目录下的各目录或文件的用途。在不同的目录下会有不同的该文件
│ README // 简介文档
│ UPGRADING // 版本升级后可能出现不兼容,该文档记录了从老版本升级需要修改的地方.
├─doc //lwip自带的文档,其实没有同步更新,看一遍了解一下吧!API的介绍直接看前文的连接
├─src /* 源码文件部分,核心协议实现.
│ ├─apps  //上层应用,包括sntp,tftp,snmp,dns…
│ ├─core  //核心源码,ipv4,ipv6,tcp,udp…
│ ├─include //头文件
│ └─netif  //这个比较特殊,底层接口处理,可以简单的理解为网卡的处理
└─test // 一些协议栈内核测试程序.个人觉得还是很有用的,特别是做项目的伙伴驱动依赖与他人时,可以先验证协议栈的通路.(回环测试)

无外乎就是一个通用项目开发的结构嘛,版本记录,说明文档,源码,头文件,测试用例.
这样理解简单多了,何必一开始就整那么复杂呢.
当然啦,复杂的,我也整了个思维盗图,感兴趣的也可以看看.
https://naotu.baidu.com/file/6756b868489653b468f0e7525caaedf1  //LWIP源码结构
百度脑图,因为免费,线上操作,哈哈.

**

虽然

**简单,但还是要说几点重要的:此刻需要记笔记,看不懂没关系,有个基本概念就行,后面当然肯定必须会再次并且多次讲到.

LWIP一句话记住就行:
一项工程,两份配置,三种内存分配,四套操作API,五步初始化,六个"数据流",七个数据结构
1.一项工程,就不用多说了,就是基本套路,上面介绍目录结构时提到的.

版本记录,说明文档,源码,头文件,测试用例.

2.两份配置

opt.h和lwipopts.h,这个也很好理解,一般来说做开发的都清楚,不要动第三方的源码,所以为了保持
lwIP TCP/IP协议栈中源码的独立性,一般不会直接更改原生的opt.h ,而是会单独添加一个用户自定义的文件来表明用户自己的配置,即 lwipopts.h 。
**相同配置以lwipopts.h为准,差异配置各尽其用.**

3.三种内存分配

                |C库自带内存分配策略(malloc/free/realloc)
LWIP内存分配机制  |动态内存堆(Heap)分配策略
                |动态内存池(pool)分配策略
不懂不要紧,其实我也不懂,内存的确是一块比较难啃的骨头,慢慢来.

4.四套操作API

          |calback-style,简单称原始API,简记RAW/Native API.(**无操作系统时唯一可用的API**)
LWIP API  |                                  |Netconn API
          |sequential-style,底层封装API,又细分为|NETIF API
                                             |Socket API
这个好像也有点儿复杂,等后面具体再分析吧.

5.五步初始化

这里主要是指在使用lwip的过程中一般的初始化调用流程:
xxx_init(网络驱动,一般由具体厂商弄,比如BCM,RTL,AW...)
tcpip_init(lwip的初始化流程了)
lwip_init(就是一些通用协议,内存,网卡的初始化调用)
netif_init(网卡的初始化,同上步还有很多同级的初始化操作,具体后面再看)
ethernetif_init(底层硬件初始化,上面的netif可以理解为抽象的网卡,后面细聊)

***当然这里也是为了方便大家记忆,有点儿牵强的提取了这五步初始化.特别是第三步lwip_init()东西可多了.***

6.六个"数据流"

这里是为了理解数据流向,记下最重要的几个收发API.
以TCP为例:
tcp_input()                           tcp_output()
ipv4_input()                          ipv4_output()
ethernetif_input()<------------------->ethernetif_output()

当然也不是很详细,比如期间还要arp的啊,netif的啊,乃至最底层low_level_input/output()...

7.七个数据结构

这里也是强行为了好记忆,其实重要的数据结构远不止七个,姑且先这样吧.以下的都是结构体:
netif--->ethernetif   抽象网卡到底层硬件描述
ip4/6_addr_t--->eth_hdr  ip地址到mac地址
dhcp            dhcp数据
tcp/udp_pcb        tcp/udp控制块
**pbuf            最最重要的整个协议栈的数据包**

最后谈谈我的学习习惯

学习嘛一贯作风:

第一遍怎么简单怎么来,会用就行.
第二遍怎么复杂怎么来,为什么这么用.
第三遍想怎么来就怎么来,形成自己的装在脑中.

-------------------------------------------
这期就到这里了,LWIP想怎么玩就怎么玩,我们下期再见.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章