您的位置:首页 > 其它

contiki 源码分析之mac层(四)(core / net / mac)

2015-01-23 20:11 274 查看
这部分对contiki的mac层代码进行了分析总结,并且给出了笔者自己绘制的mac层中帧的结构图。mac层集中了多种处理协议,以下对各个文件的功能概要及使用要点进行总结,希望对使用到contiki源码mac层的童鞋有所帮助,以下是总结的内容:

一、contiki-mac层中帧的结构如下图所示:



二、文件说明如下所示:
mac.c/mac.h
mac.h中定义了mac层需要的驱动程序以及返回状态值,其中有一个函数对外提供接口,void mac_call_sent_callback()这个函数调用一个mac_callback_t sent 类型的函数指针,可以在debug状态下显示mac层调用信息;

xmac.c / xmac.h
A simple power saving MAC protocol based on X-MAC [SenSys 2006]
1. 定义了rdc_driver类型的mac层驱动,由此可见此mac层是基于rdc的;
2. xmac_set_announcement_radio_txpower(int txpower); 发送功率的函数;
3. 具体实现看得马马虎虎,但是有一点可以发现他有一套自己的功耗控制;
4. MAC层管理着接收到的包哪些要被过滤掉:例如接收到的包的目的地址非本节点地址, 包的源地址非邻居地址等等;
5. #define MAX_ENCOUNTERS 4 定义管理的最多邻居节点;

cxmac.c / cxmac.h
A simple power saving MAC protocol based on X-MAC [SenSys 2006]
内容大致与xmac.c一致

nullmac.c / nullmac.h
一个无作为的mac层驱动;调用了 nullrdc.h 的接口;

frame802154.c / frame802154.h
1. 定义了MAC层发送(或接收)帧的种类,地址种类,以及安全协议的宏定义;
2. 定义了FCF结构体(first control field, 2字节);
3. 定义了辅助安全字段(类型为:frame802154_aux_hdr_t),以及包含含安全字段的安全头部(类型:frame802154_aux_hdr_t);
4. 定义了MAC 层的帧结构(类型为:frame802154_t);
5. field_len( frame802154_t *p, field_length_t *flen) 函数是根据frame802154_t帧结构体的模式字段计算帧的各个可变长度字段的长度值,并保存在flen结构体中;
6. addr_len(uint8_t mode) 根据地址模式计算出MAC头中地址的长度;

7. 对外提供的接口有:
(1)int frame802154_hdrlen(frame802154_t *p) 返回将要发送到air中的MAC帧的头部长度;
(2)frame802154_create(frame802154_t *p, uint8_t *buf, int buf_len) 将帧结构体中的数据初始到buf中,buf中保存的是真正要发送到air中的帧;
(3)int frame802154_parse(uint8_t *data, int len, frame802154_t *pf) 将从air中接收的长度为len的数据(即MAC帧)翻译到frame802154_t 结构体中;

framer-802154.c / framer-802154.h
作为MAC层的代理,封装了 frame802154.h中的函数frame802154_create()、frame802154_parse(),对外提供了两个与打包帧与解包帧的接口(或者驱动接口),起到联接packetbuf.c/packetbuf.h与frame802154.c / frame802154.h的作用;

1. is_broadcast_addr(uint8_t mode, uint8_t *addr) 函数通过地址模式以及地址指针判断地址是否为广播,是则返回1;

2. int create(void) 从frame802154.c / frame802154.h 中创建数据帧到packetbuf.c/packetbuf.h中

3. int parse(void) 从packetbuf.c/packetbuf.h 中创建解析后的帧结构体到frame802154.c / frame802154.h中

framer.h
定义了framer-80514.h所需要的MAC层代理数据结构

framer-nullmac.c / framer-nullmac.h
null MAC帧指的是没有负载只有帧头的帧;类似freamer-802154也有包含create()与parse()的代理framer_nullmac,与packetbuf.h文件进行交互;

rdc.h
radio duty cycling 驱动头文件,定义了

nullrdc.c / nullrdc.h
其中用到了framer中的一些方法
1. send_one_packet() 调用mac层回调函数向其他节点发送信息,其中还包括了ACK确认的工作;
2. packet_input(void) 接收包的的头文件,其中还有包的抛弃机制:重复接受,非本节点包的拒收;

nullrdc-noframer.c / nullrdc-noframer.h
一个无作为的MAC协议
1. 从这里能看到一个现象,每次在进行RDC发送包使都要先从NETSTACK_RADIO发送,然后在调用MAC层的回调函数mac_call_sent_callback(sent, ptr, ret, 1),个人觉得,也许这是为了让MAC层知道发送成功,同时改变MAC层保存的发送状态信息;
2. 从外界读入包的时候需要调用mac.h驱动中的input()函数;

lpp.c / lpp.h
LPP是一个低功耗的MAC协议,它在每次无线电打开的时候发送一个探测包,如果有一个节点想发送数据,它就能在听到探测包后发送数据。也就是说,想发数据,就打开无线电监听探测包。
1. 它具有能量消耗统计;

phase.c / phase.h
一个通用radio duty cycle 时间阶段分配的优化处理协议

sicslowmac.c / sicslowmac.h
简单的无优化的MAC协议,提供radio数据到
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: