您的位置:首页 > 理论基础 > 计算机网络

contiki 源码分析之网络层(三)(core / net)

2015-01-23 19:51 483 查看
这一部分对contiki的核心文件中的网络部分进行了分析。总结了core / net目录下的各个文件实现的功能以及使用要点,还有笔者发现的代码中可能有问题的地方。

packetbuf.c / packetbuf.h
rime层包缓存管理
1. 定义了以下包类型:
#define PACKETBUF_ATTR_PACKET_TYPE_DATA 0
#define PACKETBUF_ATTR_PACKET_TYPE_ACK 1
#define PACKETBUF_ATTR_PACKET_TYPE_STREAM 2
#define PACKETBUF_ATTR_PACKET_TYPE_STREAM_END 3
#define PACKETBUF_ATTR_PACKET_TYPE_TIMESTAMP 4
2. 定义了24个16bit的特征值以及4个rimaddr的地址;
3. 内存对齐的设计方法
/* The declarations below ensure that the packet buffer is aligned on
an even 16-bit boundary. On some platforms (most notably the
msp430), having apotentially misaligned packet buffer may lead to
problems when accessing 16-bit values. */
static uint16_t packetbuf_aligned[(PACKETBUF_SIZE + PACKETBUF_HDR_SIZE) / 2 + 1];
static uint8_t *packetbuf = (uint8_t *)packetbuf_aligned;

NOTE! 存在的错误!!
在<packetbuf.c>中宏判断为 #if !PACKETBUF_CONF_ATTRS_INLINE
在<packetbuf.h>中宏判断为#if PACKETBUF_CONF_ATTRS_INLINE
这种不一致会导致接口不可用



queuebuf.c / queuebuf.h
为Rime层提供 buffer缓存块儿的管理,在剔除页面交换功能与调试功能后,我们可以容易看出它的特征,其特征、作用、函数功能介绍如下:
1. 为rime层与packetbuf层之间提供帧缓存队列,可以与packetbuf层交换数据;
2. 实现了RAM与flash之间块儿的交换功能,其中依赖与caffe文件系统,在此不去分析;
3. MEMB(bufmem, struct queuebuf, QUEUEBUF_NUM);
MEMB(refbufmem, struct queuebuf_ref, QUEUEBUF_REF_NUM);
MEMB(buframmem, struct queuebuf_data, QUEUEBUFRAM_NUM);
定义了以上三种缓存区,分别用来存放packetbuf中的所有数据,跟据packetbuf中的数据为本地和引用两种不同类型,分别保存在queuebuf_data(本地)和queuebuf_ref(引用)中;缺省情况下本地引用有8块儿,非本地引用有2块儿;其中queuebuf_data与bufmem要建立联系;
4. struct queuebuf * queuebuf_new_from_packetbuf(void) 从packetbuf中创建一个queuebuf结构,根据不同的packetbuf种类(数据负载为本地和参考两种不同)分别构建了引用和非引用的两种queuebuf, 其中创建的queuebuf也保存在了MEMB( )开辟的内存块中;
5. 以下这个函数有着很好的设计思路, 虽然传递进去的指针可能是queuebuf_ref的也可能是queuebuf的,但是通过在内存中查看是否存在其指针就可以区分出来是属于那种类型的指针啦!
void queuebuf_free(struct queuebuf *buf)
{
if(memb_inmemb(&bufmem, buf)) {
memb_free(&buframmem, buf->ram_ptr);
memb_free(&bufmem, buf);
} else if(memb_inmemb(&refbufmem, buf)) {
memb_free(&refbufmem, buf);
}
}
6. 使用时需要特别注意的几个函数,其参数必须只能是包含queuebuf_data的queuebuf指针:
(1)int queuebuf_datalen(struct queuebuf *b)
(2)rimeaddr_t * queuebuf_addr(struct queuebuf *b, uint8_t type)
(3)packetbuf_attr_t queuebuf_attr(struct queuebuf *b, uint8_t type)



rimeaddr.c / rimeaddr.h
这个模块的作用是管理rime地址,有复制,比较地址的功能;

1. RIMEADDR_CONF_SIZE宏决定了RIME地址的长度,默认长度为两个字节;

2. rime地址的定义为 rimeaddr_t;

3. 定义了空rime地址rimeaddr_null,各字节为0;

4. 定义了节点的rime地址rimeaddr_node_addr,通过void rimeaddr_set_node_addr(rimeaddr_t *addr)设置;

netstack.c / netstack.h
对网络底层协议栈的初始化工作,包括radio、rdc、mac、network;其中还定义了网络层的驱动接口:(1)初始化网络层驱动;(2)收到包的回调函数;
1. 在netstack.h 中配置网络协议栈中各层需要用到的协议驱动(因为contiki为每一层提供了多种驱动选择);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: