《TCP/IP详解 卷2:实现》 —2.6.2 mtod和dtom宏

举报
华章计算机 发表于 2019/11/20 16:34:34 2019/11/20
【摘要】 本节书摘来自华章计算机《TCP/IP详解 卷2:实现》一书中第2章,第2.6.2节,作者是[美]加里R.赖特(Gary R.Wright),W. 理查德史蒂文斯(W.Richard Stevens),陆雪莹 蒋慧 等译 谢希仁 校。

2.6.2   mtod和dtom宏

宏mtod和dtom也定义在文件mbuf.h中。它们简化了复杂的mbuf结构表达式。

image.png

mtod(“mbuf到数据”)返回一个指向mbuf数据的指针,并把指针声明为指定类型。例如代码

image.png

存储在mbuf的数据(m_data)指针ip中。C编译器要求进行类型转换,然后代码用指针ip引用IP首部。我们可以看到当一个C结构(通常是一个协议首部)存储在一个mbuf中时会用到这个宏。当数据存放在mbuf本身(图2-14和图2-15)或存放在一个簇(图2-16)中时,可以用这个宏。

宏dtom(“数据到mbuf”)取得一个存放在mbuf中任意位置的数据的指针,并返回这个mbuf结构本身的指针。例如,若我们知道ip指向一个mbuf的数据区,下面的语句序列

image.png

image.png

把指向这个mbuf开始的指针存放到m中。我们知道MSIZE(128)是2的幂,并且内核存储器分配器总是为mbuf分配连续的MSIZE字节的存储块,dtom仅仅是清除参数中指针的低位来发现这个mbuf的起始位置。

宏dtom有一个问题:当它的参数指向一个簇或在一个簇内时,如图2-16所示,它不能正确执行。因为那里没有指针从簇内指回mbuf结构,不能使用dtom。这导致了下一个函数:m_pullup。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。