LWIP一句话记住就行:
一项工程,两份配置,三种内存分配,四套操作API,五步初始化,六个"数据流",七个数据结构
-------------------------------------------
啦不失一般性,我也会简单讲一下LWIP的目录结构,点到为止,毕竟一开始还是面对初学者,没必要整有些没的,吓到了不好.或者一些大神原本看都看到吐了的东西,再看浪费时间,扫一眼就够了.
我呢,全系列以最新的2.0.0及以上开始整.
小白请自觉跳转这篇博文(https://blog.csdn.net/ZCShouCSDN/article/details/79229728).
先整张图:
可怕不......
再来看看我准备的
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想怎么玩就怎么玩,我们下期再见.