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

       这部分对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数据到


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值