LWIP源码分析——ip.c
LWIP
作为轻量级tcpip
栈,ip
协议的处理当然是最主要的任务,也是站在协议角度理解LWIP
的入口。
ip.c
的内容很少,因此先分析,代码放在最后
整体看,ip.c
只是一个通用的接口,真正主体是ip4.c
,ip6.c
以及ip.h
头文件定义的几个结构体。
1. 宏
ip.c
函数中用两个宏控制:LWIP_IPV4
LWIP_IPV6
分别是控制ip
栈走ipv4
还是ipv6
的协议
首个位置lwip/opt.h
是LWIP
所有宏定义及默认值的位置,基本上所有代码都会引用这个文件,这就使得在改文件中的更改可以控制整个协议栈的使用。
如果#if LWIP_IPV4 || LWIP_IPV6
也就是至少支持ipv4
或ipv6
这个文件才刚开始起作用,否则在编译过程中整段代码都不被编译。
随后,仅引用了两个头文件,定义了一个全局变量,又出现第二道门槛#if LWIP_IPV4 && LWIP_IPV6
,意味着仅当同时支持v4v6
才会调用下面的入口函数,否则…,根据经验我们猜想一定是在某处用宏定义的方式将下面的入口函数定义为特定版本的函数。
2. 代码分析
#include "lwip/opt.h"
opt.h
为宏开关的文件,此处只是LWIP_IPV4
,LWIP_IPV4
两个宏的引用用到。(后续会单独分析,链接至此)
#if LWIP_IPV4 || LWIP_IPV6
开关(或)
struct ip_globals ip_data;
名字上看用途很明显,是一个全局ip
结构体,至于存储的内容,分析ip.h
时再分析
#if LWIP_IPV4 && LWIP_IPV6
这里用了一个&&
的方式,意味着只有同时支持v4v6
才往下走
const ip_addr_t ip_addr_any_type = IPADDR_ANY_TYPE_INIT;
这里这段便是需要ip_addr.h
中定义的内容,这里又定义了一个结构体,直观看像是定义了一个本地地址,当前文件中也没有用到,先记下
char *ipaddr_ntoa(const ip_addr_t *addr)
这是ip
地址转换的函数,将一个数字形式的ip
转化为ASCII
码类型,感觉更直接的方式就是转化为一个字符串
比如192:168:1:1
→192.168.1.1
目前用到最多的时候就是打印ip
地址时候,相信用处不止于此,记下
char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen)
注解中说的是同上一个函数ipaddr_ntoa
作用相同,只不过是可重载?这个函数目前没接触过,学到了再补充
ipaddr_aton(const char<