Contiki协议栈Rime:变色龙接口chameleon

时间:2022-08-08 11:06:18

更多的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这个文件只负责提供一个接口,具体的操作要在所配置的变色龙模块中处理。