mbuf宏和函数的小结-jpeg标准的中文文档pdf
在操作mbuf的代码中,我们会遇到图2-19中所列的宏和图2-20中所列的函数。图2-19中的宏以函数原型的形式显示,而不是以#define形式来显示参数的类型。由于这些宏和函数主要用于处理mbuf数据结构并且不涉及联网问题,因此我们不查看实现它们的源代码。不过,如果你想深入研究这些宏和函数在实际中的应用,可以参考一些相关的资料,比如这篇详细介绍tcp代码和mbuf代码的文章。
还有另外一些mbuf宏和函数用于Net/3源代码的其他地方,但由于我们在本书中不会遇到它们,因此没有把它们列于图中。
宏描述
- MCLGET 获得一个簇(一个外部缓存)并将m指向的mbuf中的数据指针(m_data)设置为指向这个簇。如果存储器不可用,返回时不设置mbuf中的M_EXT标志
```c
void MCLGET(struct mbuf *m, int nowait);
```
- MFREE 释放一个m指向的mbuf。若m指向一个簇(设置了M_EXT),这个簇的引用计数器减1,但这个簇并不被释放,直到它的引用计数器降为0(如2.9节所述)。返回m的后继(由m->m_next指向,可以为空)存放在n中
```c
void MFREE(struct mbuf m, struct mbuf n);
```
- MGETHDR 分配一个mbuf,并把它初始化为一个分组首部。这个宏与MGET(图2-12)相似,但设置了标志M_PKTHDR,并且数据指针(m_data)指向紧接分组首部后的100字节的缓存
```c
void MGETHDR(struct mbuf *m, int nowait, int type);
```
- MH_ALIGN 设置包含一个分组首部的mbuf的m_data,在这个mbuf数据区的尾部为一个长度为len字节的对象提供空间。这个数据指针也是长字对准方式的
```c
void MH_ALIGN(struct mbuf *m, int len);
```
- M_PREPEND 在m指向的mbuf中的数据的前面添加len字节的数据。如果mbuf有空间,则仅把指针(m_data)减len字节,并将长度(m_len)增加len字节。如果没有足够的空间,就分配一个新的mbuf,它的m_next指针被设置为m。一个新mbuf的指针存放在m中。并且新mbuf的数据指针被设置,这样len字节的数据放置到这个mbuf的尾部(调用MH_ALIGN)。如果一个新mbuf被分配,并且原来的mbuf的分组首部标志被设置,则分组首部从老mbuf中移到新mbuf中
```c
void M_PREPEND(struct mbuf *m, int len, int nowait);
```
- dtom 将指向一个mbuf数据区中某个位置的指针x转换成一个指向这个mbuf的起始的指针。
```c
struct mbuf dtom(void x);
```
- mtod 将m指向的mbuf的数据区指针的类型转换成type类型
```c
type mtod(struct mbuf *m, type);
```
如果你对这些宏的实现细节感兴趣,不妨看看这篇TCP IP技术详解的资料,里面有更多的技术细节和背景知识,让你对这些概念有更深入的理解。
还有一些关于mbuf和IP处理模块的资源也值得一读,比如IP处理模块以及Mbuf的详细介绍,帮助你全面了解这部分内容。更多资料请查看TCP IP协议技术详解学习笔记,让你的知识更加丰富多彩!
下载地址
用户评论