📄 mac.h
字号:
WORD panId;
UINT8 srcAddrMode;
ADDRESS srcAddr;
UINT8 dstAddrMode;
ADDRESS dstAddr;
MAC_ENUM status;
} MLME_COMM_STATUS_INDICATION;
typedef struct{
LONG_ADDR Deviceaddr;
Node_Capability cap_info;
bool security_use;
uint8_t aclentry;
}MLME_ASSOCIATE_INDICATION;
//做扫描时候容忍最多保存记录多少个PAN 描述符和 信道ED值,与实现相关的参数,可由自己确定
#define MAC_MAX_PAN_DESCRIPTORS 5
#define MAC_MAX_ED_MEASUREMENT 16
typedef struct {
BYTE status;
BYTE scanType;
DWORD unscannedChannels;
UINT8 resultListSize;
union
{
int8_t pEnergyDetectList[MAC_MAX_ED_MEASUREMENT];
PAN_DESCRIPTOR pPANDescriptorList[MAC_MAX_PAN_DESCRIPTORS];
};
} MLME_SCAN_CONFIRM;
//--------------------------------------------------//
//---------下面为Zigbee中MAC层原语的函数声明--------//
//--------------------------------------------------//
//原语函数声明
//对于某些比较简单的只返回状态成功与否的confirm原语,可以放在request原语的返回值里面返回。
//对于GTS,zigbee协议里面没有使用,故本版本的协议实现没有实现GTS相关的原语。
//----------------------------------------------------------------------------------------------------------
// MCPS and MLME prototypes (ordered alphabetically)
void mcpsDataRequest(NODE_INFO dst, NODE_INFO src,UINT8 msduLength, BYTE *pMsdu, BYTE msduHandle, BYTE txOptions);
void mcpsDataConfirm(MAC_ENUM status, BYTE msduHandle);
//参数作为一个全局的数据结构体来访问
void mcpsDataIndication(MCPS_DATA_INDICATION mcps_data_indication_info);
//没有实现该原语
MAC_ENUM mcpsPurgeRequest(BYTE msduHandle);
void mlmeAssociateRequest(UINT8 logicalChannel, BYTE coordAddrMode, SHORT_ADDR coordPANId, ADDRESS pCoordAddress, Node_Capability capabilityInformation, bool securityEnable);
//void mlmeAssociateRequest(UINT8 logicalChannel, BYTE coordAddrMode, WORD coordPANId, ADDRESS *pCoordAddress, Node_Capability capabilityInformation, bool securityEnable);
void mlmeAssociateIndication(MLME_ASSOCIATE_INDICATION mlme_associate_indication_info);
void mlmeAssociateResponse(LONG_ADDR deviceAddress, SHORT_ADDR assocShortAddress, BYTE status, bool securityEnable);
void mlmeAssociateConfirm(SHORT_ADDR AssocShortAddress, BYTE status);
//参数作为一个全局的数据结构体来访问
void mlmeBeaconNotifyIndication(MLME_BEACON_NOTIFY_INDICATION beacon_payload_info);
void mlmeCommStatusIndication(WORD panId, BYTE srcAddrMode, ADDRESS *pSrcAddr, BYTE dstAddrMode, ADDRESS *pDstAddr, BYTE status);
void mlmeDisassociateRequest(LONG_ADDR pDeviceAddress, BYTE disassociateReason, bool securityEnable);
void mlmeDisassociateIndication(LONG_ADDR deviceAddress, BYTE disassociateReason, bool securityUse, BYTE aclEntry);
void mlmeDisassociateConfirm(MAC_ENUM status);
MAC_ENUM mlmeGetRequest(MAC_PIB_ATTR pibAttribute, void *pPibAttributeValue);
void mlmeOrphanIndication(LONG_ADDR orphanAddress, bool securityUse, BYTE aclEntry);
void mlmeOrphanResponse(LONG_ADDR orphanAddress, SHORT_ADDR shortAddress, bool associatedMember, bool securityEnable);
//本代码不实现这两个原语
void mlmePollRequest(BYTE coordAddrMode, WORD coordPANId, ADDRESS *coordAddress, bool securityEnable);
void mlmePollConfirm(MAC_ENUM status);
MAC_ENUM mlmeResetRequest(bool setDefaultPIB);
//本版本代码不实现下面两个原语
void mlmeRxEnableRequest(bool deferPermit, uint32_t rxOnTime, uint32_t rxOnDuration);
void mlmeRxEnableConfirm(MAC_ENUM status);
MAC_ENUM mlmeScanRequest(BYTE scanType, DWORD scanChannels, UINT8 scanDuration);
//没有必要定义mlmescanconfirm函数,scan request得到的结果:
//状态由scan request返回,其他的结果由全局结构MLME_SCAN_CONFIRM返回;
void mlmeScanConfirm(MLME_SCAN_CONFIRM scan_result_info);
MAC_ENUM mlmeSetRequest(MAC_PIB_ATTR pibAttribute, void *pPibAttributeValue);
//void mlmeStartRequest(SHORT_ADDR panId, UINT8 logicalChannel, UINT8 beaconOrder, UINT8 superframeOrder, bool panCoordinator, bool batteryLifeExtension, bool coordRealignment, bool securityEnable, QWORD StartTime);
void mlmeStartRequest(SHORT_ADDR panId, uint8_t logicalChannel, uint8_t beaconOrder, uint8_t superframeOrder, bool panCoordinator, bool batteryLifeExtension, bool coordRealignment, bool securityEnable , WORD StartTime);
void mlmeStartConfirm(void);
void mlmeSyncRequest(UINT8 logicalChannel, bool trackBeacon);
void mlmeSyncLossIndication(MAC_ENUM lossReason);
//--------------------------------------------------//
//----下面为Zigbee中MAC层内部需要的一些数据结构-----//
//--------------------------------------------------//
//射频发送buffer。已经打包好,准备向物理层发送的MAC帧,
//由于信标帧具有最高的发送优先级,故本队列里面不包括信标帧
//采用间接通信方式的帧由于在收到
typedef struct _TX_BUFFER
{
//队列中该结构元素是否可用,如果发送完一个不需要ack的帧
//或者发送一个需要ack的帧,并且已经收到ack帧,则发送完成后可以置IsValid为无效。
bool IsNeedAcked;
//区分各个帧的句柄
BYTE FrameHandle;
//是否发送过,表明该帧在等待ack中
bool IsTxed;
//该帧序列号,在处理应答帧的时候有用。
BYTE FrameSeq;
//该帧已经发送过的次数,初始化为aMaxFrameRetries,每发送一次,减1。为0时候,不需要发送,直接向上层报告出错。
BYTE FrameRetriesCounter;
//发送的MAC帧长度
BYTE frameLength;
//命令帧类型字段
BYTE cmd_type;
//待发送的帧负载
BYTE * payload;
struct _TX_BUFFER *next;
} TX_BUFFER;
//初始化发送队列函数声明,将IsValid置为无效,payload指针置为空.
void initial_tx_queue(void);
//射频发送队列的操作函数声明,寻找发送buffer中的一个空位置,如果没有,则返回发送忙,把须发送的包放到队列中
TX_BUFFER * add_tx_queue(BYTE framelength, BYTE * payload, BYTE framehandle, bool is_ack, BYTE frameseq,BYTE cmd_type);
//射频发送队列的删除一个元素函数声明。对于需要应答的帧,在收到对应的ack后,即可从队列中删除,释放payload域,置isvalid为无效。
//如果为一个不需要应答的帧,则发送完成收到正确的confirm后即可直接删除掉
void remove_tx_queue(BYTE frameseq);
TX_BUFFER * get_frame_pointer(BYTE frameseq);
//下面的结构用于发送任务的参数传递作用
#define MAX_TX_BUFFER_SIZE 5
typedef struct _parameter_tx_task
{
TX_BUFFER * parameter_tx_task[MAX_TX_BUFFER_SIZE];
uint8_t top;
uint8_t tail;
}parameter_tx_task;
/*
//
//标志用于存储发送时候需要的信息,不用再到MAC帧里面去查找
typedef struct _MAC_FRAME_FLAG
{
BYTE IsValid :1; //表示该帧是否处理完毕,那么该存储空间可以重新放入一个新的待发送的帧
BYTE IsAcked :1; //
} MAC_FRAME_FLAG;
*/
//pending transaction队列,协调者用于存储采用间接通信的数据或命令帧
//注意:pending队列里面的帧,在发送时,还需要打包进入TX_BUFFERS队列,然后才能发送。在pending队列时候还没有分配帧序列号
typedef struct _INDIRECDT_TX_PENDING_QUEUE
{
//该元素是否有效,在将该元素添加到发送队列中去以后,可以置该域为无效。同时置pending_payload指针为空
bool IsValid;
//可以表明该间接通信的帧已经经历过多少个超帧,如果计数到零,则需要通过原语向上层报告超时。
//对于数据帧或协调者发给设备的disassociation notification帧,可以采用相应的confirm原语向高层报告
//对于association response帧,采用comu_status原语向高层报告
//该值的更新在每次发送信标帧时候,递减1,减到0时候,向上层报告,初始值设为macTransactionPersistenceTime
uint16_t MacTranPersistCounter;
//用于区分是哪个帧的句柄
BYTE FrameHandle;
//帧控制域,两字节
FRAME_CONTROL framectl_field;
bool associate_or_disassociate;
SHORT_ADDR shortaddralloc;
union{
BYTE associate_status;
BYTE disassociation_reason;
};
union{
LONG_ADDR associate_device_addr;
LONG_ADDR end_device_addr;
};
//目标地址和源地址信息,包括PANID
NODE_INFO dst;
NODE_INFO src;
//pending帧的长度
BYTE frameLength;
//该帧的负载域
BYTE * high_level_payload;
struct _INDIRECDT_TX_PENDING_QUEUE *next;
//?????需要扩展?
} INDIRECT_TX_PENDING_QUEUE;
//操作函数声明
//pending队列的初始化函数
void initial_pending_queue(void);
//添加一个数据包到pending队列中,如果队列满,需要采用对应的原语通知高层。
void add_pending_queue(BYTE framehandle, FRAME_CONTROL framectl, NODE_INFO dst, NODE_INFO src, BYTE framelength, BYTE *payload,BYTE associate_status_or_disassociate_reason,bool associate_or_disassociate,LONG_ADDR addr,SHORT_ADDR shortaddralloc);
//从pending队列中删除一个元素
void remove_pending_queue(INDIRECT_TX_PENDING_QUEUE *current);
INDIRECT_TX_PENDING_QUEUE * get_pending_frame(NODE_INFO dst);
bool Is_data_pending(NODE_INFO dst);
void transmit_with_csmaca(void);
uint32_t direct_transmit(uint8_t psdulength,uint8_t * psdu);
//MAC层在收到一个帧后如何处理该帧的函数(或任务)
void mac_frame_rcvd(void);
//定时器中断服务程序post的一个任务
void mac_timer_task(void);
uint16_t mac_timer3queue_getnextinterval(void);
//物理信道状态
//物理层将根据该状态进行接收的帧的预过滤,减轻高层负担
typedef enum {
PHY_IDLE=0,
DOINGCSMA_CA,
TRANSMITTING_FRAME,
WAITING_FOR_ACK,
WAITING_FOR_BEACON,
INACTIVE_PERIOD
}PHY_CHANNEL_STATE ;
PHY_CHANNEL_STATE phy_channel_state;
#define MAX_RX_BUFFER_SIZE 3
typedef struct _RX_BUFFER
{
BYTE framelength;
BYTE * payload;
BYTE lqi;
uint32_t timestamp;
struct _RX_BUFFER *next;
}RX_BUFFER;
RX_BUFFER * add_to_rx_buffer(BYTE framelength, BYTE *payload,BYTE lqi,uint32_t timestamp);
void remove_from_rx_buffer(RX_BUFFER * framepointer);
//该任务负责是从物理层取一个帧并进行解析
void mac_get_received_frame(void);
//void beacon_received(void);
void data_request_frame_send(void);
void pending_data_send(NODE_INFO dst);
void data_frame_send(BYTE * nwkpayload, BYTE nwkpayloadlength, NODE_INFO dst,NODE_INFO src,BYTE frameHandle);
void associate_request_frame_send(SHORT_ADDR panid,NODE_INFO dst, Node_Capability node_capinfo);
void disassociate_notification_frame_send(BYTE disassociation_reason,LONG_ADDR end_device_addr);
void panid_confilct_frame_send(void);
void orphan_notification_frame_send(void);
void beacon_request_frame_send(void);
//#ifdef I_AM_COORDINATOR
void coordinator_realignment_frame_send(bool Isunicast, NODE_INFO dst, SHORT_ADDR allocated_addr);
void associate_response_frame_send(SHORT_ADDR coor_short_addr, BYTE associate_status,LONG_ADDR associate_device_addr,SHORT_ADDR shortaddralloc);
void beacon_frame_send(bool short_or_long);
void mac_frame_send(void);
void pending_frame_handle(void);
//endif
void beacon_frame_tx_timing(void);
void mlmesyn_finished(void);
void synrequest_task(void);
uint8_t random_generate(void);
//uint8_t wait_for_backoff_boundary(void);
uint8_t do_backoff(void);
uint8_t csma_initial(void);
void failure_to_tx_with_csma(void);
void CSMA_CA_DOING(void);
void scan_task(void);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -