LwIP 代码分析(发送一个UDP包) – 第四集

/ 0评 / 1

其实发送一个包就这么多.

其中netbuf_new跟进去,发现其实就是一个calloc.

netbuf_alloc就是申请到内存,指针指向申请到的位置.

memcpy是标准函数,不用多说.

netbuf_delete就是删除calloc到的东西.

那么其实就剩下了netconn_send,这个函数看起来应该比较复杂,因为其他地方什么都没干.进去一看,还是apimsg的安全调用.不得不说安全性十足,而我们一开始就知道,直接看fn就行,其他都是安全需要.

1396行的错误判断,我们一开始就见过.就是如果这个conn有问题,就不要往下继续了.

接下来判断PCB是有效的,再跳转到NETCONN_UDP,明显这个函数只适合UDP.LWIP_CHECKSUM_ON_COPY又刚好是打开的,那么就是要校验.而后续一个是udp_send_chksum,一个是udp_sendto_chksum.

如果是本机发,就走到上面得判断,下面的判断就是有目标端口,目标地址什么的,其实最终是调用udp_sendto_chksum的.

进去就是ip_route,因为IP_IS_ANY_TYPE_VAL恒定为0,所以没被编译进去.

实际上,包就是从ip_route这一段,数据就出去了.这就是到达了IP层,记得七层模型里面,TCP还在比较靠上的一层.

可见,ip_route是查找到源网卡,以便后续构建.接着在sendto里面再获取了本地的src_ip(发送者IP).

到了udp_sendto_if_src_chksum,里面很多判断,这个代码尤其长.

看起来是不是又长又头疼.稍微把一些安全性判断去掉.代码就很短了.

当我们断点在这个位置的时候,udphdr已经写入(udp头)

查看变量看到.

注意这里是0x781E其实是0x1E78,因为是我们的CPU是LE,但是以太网是BE.正是7800端口,目标端口.

进来后,需要判断have_chksum,这个参数又是超级早传递进来的.当NETBUF_FLAG_CHKSUM是有效时候,这个参数就有效.而默认这个是没的,所以就是全校验(否则,有效就是部分校验).

我们知道有校验就行,不关心怎么校验的.然后继续跑就到ip_output_if_src,这个总是是发包了吧.(确实这样,但是这里还有很多层.).

进入后立马进入ip4_output_if_opt_src函数,又继续用同样方法,添加一个IP头大小的内容.

IP头总算是一帧的最开始,然后到iphdr = (struct ip_hdr *)p->payload就是把iphdr定义为pbuf的开始数据.关于IP头,可以看看定义.(实际上还是不对,还有个叫以太网帧的玩意).

随后960行判断帧有没有大于MTU大小,大于的话还得拆分帧.

记得这个发送其实是到etharp_output,还不是终点,是不是有点恐怖,这深度.不,这还没到,还要封装以太网帧.可见LwIP给我们干了好多啊.

发表评论

电子邮件地址不会被公开。 必填项已用*标注