OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2804|回复: 3

lwip,一个完整数据包的结构

[复制链接]

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2016-7-11 23:55:31 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 liuchang 于 2016-7-11 23:56 编辑

引子:[mw_shl_code=c,true]/**
* Send an icmp packet in response to an incoming packet.
*
* @param p the input packet for which the 'unreachable' should be sent,
*          p->payload pointing to the IP header
* @param type Type of the ICMP header
* @param code Code of the ICMP header
*/
static void
icmp_send_response(struct pbuf *p, u8_t type, u8_t code) {}[/mw_shl_code]
上面的参数p->payload 指向 IP header


问题:我原先以为一个pbuf的payload一定是指向某个以太网帧的头部(如果一个pbuf装不完,肯定是从中间某个地方截断的),就像下面这张图


可是这里却是指向IP头部,那么就需要再申请一个pbuf,用它的payload去装载以太网帧头部(也就是14个字节),然后将这个pbuf与刚才装载IP头部的pbuf通过链表连接起来.

请问,为什么不将它们封装在一个pbuf里面,也不见得就装不下啊,这里有哪些考量,还是我理解错了???恳请指教~~~
IMG_20160711_233021.jpg

电子爱好者
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2016-7-12 13:22:56 | 显示全部楼层
电子爱好者
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-7-12 14:19:26 | 显示全部楼层
payload在从网卡接收到数据时是指向以太网帧头部的,只是你没看懂lwip里面的流程。协议栈这东西是一层一层的,2层处理完了,会对payload进行偏移,到了icmp_send_response,自然就是ip头了。icmp_send_response 其实只是处理unreachable的包,正常的包在icmp_input里面已经处理了。不可达的包需要将原来的IP包头和ICMP包头当成数据发送回去。所以需要重新分配一个pbuf,并拷贝原先的头,然后进行处理。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-7-12 14:21:29 | 显示全部楼层
pbuf_header这个函数你好好看看。这个就是对payload进行便宜的。在icmp_input里一开始就偏移到icmp_echo_hdr处。不可达又移回去。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 20:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表