更多的Contiki协议栈知识,请参考索引目录:
《Contiki协议栈:索引目录》
1 概述
变色龙模块的作用是将Rime协议栈传递下来的数据进行处理,生成包头。
相关源文件位于:contiki/core/net/rime/chameleon.[ch]
。
2 相关定义
struct chameleon_module
struct chameleon_module {
struct channel *(* input)(void);
int (* output)(struct channel *);
int (* hdrsize)(const struct packetbuf_attrlist *);
};
struct chameleon_module用于定义一个变色龙模块,其中:
input:函数指针。底层mac协议收到消息后,会将消息放到packbuf里面。input函数负责解析packetbuf的包头,生成包属性,然后传递给上层Rime协议栈。
output:函数指针。负责将上层Rime协议传递到packetbuf中的数据生成包头,然后送给MAC层处理。
hdrsize:变色龙生成的包头的尺寸。单位是字节。
CHAMELEON_MODULE
#ifndef CHAMELEON_MODULE
#ifdef CHAMELEON_CONF_MODULE
#define CHAMELEON_MODULE CHAMELEON_CONF_MODULE
#else /* CHAMELEON_CONF_MODULE */
#define CHAMELEON_MODULE chameleon_bitopt // 默认的变色龙模块
#endif /* CHAMELEON_CONF_MODULE */
#endif /* CHAMELEON_MODULE */
extern const struct chameleon_module CHAMELEON_MODULE;
可以看出,默认的变色龙处理模块是chameleon_bitopt,这其实就是Adam多次在论文中提到的头处理模块,实现跨层协议之间的位组合操作,以减小头部尺寸。
当然,我们也可以通过定义CHAMELEON_CONF_MODULE
来自定义变色龙处理模块,比如定义为chameleon_raw
。
3 相关函数
chameleon_init
void chameleon_init(void)
{
channel_init();
}
初始化变色龙模块。这里只做了一件事儿,初始化通道。
chameleon_parse
struct channel * chameleon_parse(void)
{
struct channel *c = NULL;
c = CHAMELEON_MODULE.input(); //调用CHAMELEON_MODULE的input函数
if(c != NULL) {
packetbuf_set_attr(PACKETBUF_ATTR_CHANNEL, c->channelno);
}
return c;
}
调用CHAMELEON_MODULE的input函数解析packetbuf中的数据。
chameleon_create
int chameleon_create(struct channel *c)
{
int ret;
ret = CHAMELEON_MODULE.output(c);
packetbuf_set_attr(PACKETBUF_ATTR_CHANNEL, c->channelno);
if(ret) {
return 1;
}
return 0;
}
调用CHAMELEON_MODULE的output函数生成头部信息。
chameleon_hdrsize
int chameleon_hdrsize(const struct packetbuf_attrlist attrlist[])
{
return CHAMELEON_MODULE.hdrsize(attrlist);
}
调用CHAMELEON_MODULE的hdrsize计算要生成的变色龙头部的长度。单位是字节。
4 总结
一路看下来,坑爹啊,啥事儿也没干,一直在调用CHAMELEON_MODULE。没错,chameleon.c这个文件只负责提供一个接口,具体的操作要在所配置的变色龙模块中处理。