⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p802_15_4mac.h

📁 802.15.4 mac 协议源程序
💻 H
📖 第 1 页 / 共 2 页
字号:
	m_TX_ACTIVE,	m_UNAVAILABLE_KEY,	m_UNSUPPORTED_ATTRIBUTE,	m_UNDEFINED			//we added this for handling any case not specified in the draft}MACenum;//MAC PIB attributes (Tables 71,72)typedef enum {	//attributes from Table 71	macAckWaitDuration,	macAssociationPermit,	macAutoRequest,	macBattLifeExt,	macBattLifeExtPeriods,	macBeaconPayload,	macBeaconPayloadLength,	macBeaconOrder,	macBeaconTxTime,	macBSN,	macCoordExtendedAddress,	macCoordShortAddress,	macDSN,	macGTSPermit,	macMaxCSMABackoffs,	macMinBE,	macPANId,	macPromiscuousMode,	macRxOnWhenIdle,	macShortAddress,	macSuperframeOrder,	macTransactionPersistenceTime,	//attributes from Table 72 (security attributes)	macACLEntryDescriptorSet,	macACLEntryDescriptorSetSize,	macDefaultSecurity,	macACLDefaultSecurityMaterialLength,	macDefaultSecurityMaterial,	macDefaultSecuritySuite,	macSecurityMode}MPIBAenum;struct MAC_PIB{	//attributes from Table 71	UINT_8	macAckWaitDuration;	bool	macAssociationPermit;	bool	macAutoRequest;	bool	macBattLifeExt;	UINT_8	macBattLifeExtPeriods;	/*	UINT_8	macBeaconPayload[aMaxPHYPacketSize-(6+9+2+1)+1];	//beacon length in octets (w/o payload):									//	max: 6(phy) + 15(mac) + 23 (GTSs) + 57 (pending addresses)									//	min: 6(phy) + 9(mac) + 2 (GTSs) + 1 (pending addresses)	*/	UINT_8	macBeaconPayload[aMaxBeaconPayloadLength+1];	UINT_8	macBeaconPayloadLength;	UINT_8	macBeaconOrder;	UINT_32	macBeaconTxTime:24;	UINT_8	macBSN;	IE3ADDR	macCoordExtendedAddress;	UINT_16	macCoordShortAddress;	UINT_8	macDSN;	bool	macGTSPermit;	UINT_8	macMaxCSMABackoffs;	UINT_8	macMinBE;	UINT_16	macPANId;	bool	macPromiscuousMode;	bool	macRxOnWhenIdle;	UINT_16	macShortAddress;	UINT_8	macSuperframeOrder;	UINT_16	macTransactionPersistenceTime;	//attributes from Table 72 (security attributes)	MAC_ACL	*macACLEntryDescriptorSet;	UINT_8	macACLEntryDescriptorSetSize;	bool	macDefaultSecurity;	UINT_8	macACLDefaultSecurityMaterialLength;	UINT_8	*macDefaultSecurityMaterial;	UINT_8	macDefaultSecuritySuite;	UINT_8	macSecurityMode;};#define macTxBcnCmdDataHType	1#define macIFSHType		2#define macBackoffBoundType	3class Mac802_15_4;class Mac802_15_4Handler : public Handler{	friend class Mac802_15_4;public:	Mac802_15_4Handler(Mac802_15_4 *m, int tp) : Handler()	{		mac = m;		type = tp;		nullEvent.uid_ = 0;	}	virtual void handle(Event* e);protected:	Mac802_15_4 *mac;	int type;	Event nullEvent;};#define TxOp_Acked	0x01#define TxOp_GTS	0x02#define TxOp_Indirect	0x04#define TxOp_SecEnabled	0x08class Phy802_15_4;class CsmaCA802_15_4;class SSCS802_15_4;class Nam802_15_4;class Mac802_15_4 : public Mac{	friend class Phy802_15_4;	friend class Mac802_15_4Handler;	friend class macTxOverTimer;	friend class macTxTimer;	friend class macExtractTimer;	friend class macAssoRspWaitTimer;	friend class macDataWaitTimer;	friend class macRxEnableTimer;	friend class macScanTimer;	friend class macBeaconTxTimer;	friend class macBeaconRxTimer;	friend class macBeaconSearchTimer;	friend class CsmaCA802_15_4;	friend class SSCS802_15_4;	friend class Nam802_15_4;public:	Mac802_15_4(MAC_PIB *mp);	~Mac802_15_4();	void init(bool reset = false);	//interfaces between MAC and PHY	void PD_DATA_confirm(PHYenum status);	void PLME_CCA_confirm(PHYenum status);	void PLME_ED_confirm(PHYenum status,UINT_8 EnergyLevel);	void PLME_GET_confirm(PHYenum status,PPIBAenum PIBAttribute,PHY_PIB *PIBAttributeValue);	void PLME_SET_TRX_STATE_confirm(PHYenum status);	void PLME_SET_confirm(PHYenum status,PPIBAenum PIBAttribute);	//interfaces between MAC and SSCS (or some other upper layer)	void MCPS_DATA_request(UINT_8 SrcAddrMode,UINT_16 SrcPANId,IE3ADDR SrcAddr,			       UINT_8 DstAddrMode,UINT_16 DstPANId,IE3ADDR DstAddr,			       UINT_8 msduLength,Packet *msdu,UINT_8 msduHandle,UINT_8 TxOptions);	void MCPS_DATA_indication(UINT_8 SrcAddrMode,UINT_16 SrcPANId,IE3ADDR SrcAddr,				  UINT_8 DstAddrMode,UINT_16 DstPANId,IE3ADDR DstAddr,				  UINT_8 msduLength,Packet *msdu,UINT_8 mpduLinkQuality,				  bool SecurityUse,UINT_8 ACLEntry);	void MCPS_PURGE_request(UINT_8 msduHandle);	void MLME_ASSOCIATE_request(UINT_8 LogicalChannel,UINT_8 CoordAddrMode,UINT_16 CoordPANId,IE3ADDR CoordAddress,				    UINT_8 CapabilityInformation,bool SecurityEnable);	void MLME_ASSOCIATE_response(IE3ADDR DeviceAddress,UINT_16 AssocShortAddress,MACenum status,bool SecurityEnable);	void MLME_DISASSOCIATE_request(IE3ADDR DeviceAddress,UINT_8 DisassociateReason,bool SecurityEnable);	void MLME_DISASSOCIATE_indication(IE3ADDR DeviceAddress,UINT_8 DisassociateReason,bool SecurityUse,UINT_8 ACLEntry);	void MLME_GET_request(MPIBAenum PIBAttribute);/*TBD*/	void MLME_GTS_request(UINT_8 GTSCharacteristics,bool SecurityEnable);/*TBD*/	void MLME_GTS_confirm(UINT_8 GTSCharacteristics,MACenum status);/*TBD*/	void MLME_GTS_indication(UINT_16 DevAddress,UINT_8 GTSCharacteristics,				 bool SecurityUse, UINT_8 ACLEntry);	void MLME_ORPHAN_response(IE3ADDR OrphanAddress,UINT_16 ShortAddress,bool AssociatedMember,bool SecurityEnable);	void MLME_RESET_request(bool SetDefaultPIB);	void MLME_RX_ENABLE_request(bool DeferPermit,UINT_32 RxOnTime,UINT_32 RxOnDuration);	void MLME_SCAN_request(UINT_8 ScanType,UINT_32 ScanChannels,UINT_8 ScanDuration);	void MLME_SET_request(MPIBAenum PIBAttribute,MAC_PIB *PIBAttributeValue);	void MLME_START_request(UINT_16 PANId,UINT_8 LogicalChannel,UINT_8 BeaconOrder,				UINT_8 SuperframeOrder,bool PANCoordinator,bool BatteryLifeExtension,				bool CoordRealignment,bool SecurityEnable);	void MLME_SYNC_request(UINT_8 LogicalChannel, bool TrackBeacon);	void MLME_POLL_request(UINT_8 CoordAddrMode,UINT_16 CoordPANId,IE3ADDR CoordAddress,bool SecurityEnable);	inline int hdr_dst(char* hdr,int dst = -2);	inline int hdr_src(char* hdr,int src = -2);	inline int hdr_type(char* hdr, UINT_16 type = 0);	inline Tap *tap(){return tap_;}	void recv(Packet *p, Handler *h);	void recvBeacon(Packet *p);	void recvAck(Packet *p);	void recvCommand(Packet *p);	void recvData(Packet *p);	bool toParent(Packet *p);protected:	void set_trx_state_request(PHYenum state,const char *frFile,const char *frFunc,int line);	double locateBoundary(bool parent,double wtime);	void txOverHandler(void);		//transmission over timer handler	void txHandler(void);			//ack expiration timer handler	void extractHandler(void);		//data extraction timer handler	void assoRspWaitHandler(void);		//association response wait timer handler	void dataWaitHandler(void);		//data wait timer handler (for indirect transmission)	void rxEnableHandler(void);		//receiver enable timer handler	void scanHandler(void);			//scan done for current channel	void beaconTxHandler(bool forTX);	//periodic beacon transmission	void beaconRxHandler(void);		//periodic beacon reception	void beaconSearchHandler(void);		//beacon searching times out during synchronization	void isPanCoor(bool isPC);private:	void checkTaskOverflow(UINT_8 task);	void dispatch(PHYenum status,const char *frFunc,PHYenum req_state = p_SUCCESS,MACenum mStatus = m_SUCCESS);	void sendDown(Packet *p,Handler* h);	void mcps_data_request(UINT_8 SrcAddrMode,UINT_16 SrcPANId,IE3ADDR SrcAddr,			       UINT_8 DstAddrMode,UINT_16 DstPANId,IE3ADDR DstAddr,			       UINT_8 msduLength,Packet *msdu,UINT_8 msduHandle,UINT_8 TxOptions,			       bool frUpper = false,PHYenum status = p_SUCCESS,MACenum mStatus = m_SUCCESS);	void mlme_associate_request(UINT_8 LogicalChannel,UINT_8 CoordAddrMode,UINT_16 CoordPANId,IE3ADDR CoordAddress,				    UINT_8 CapabilityInformation,bool SecurityEnable,				    bool frUpper = false,PHYenum status = p_SUCCESS,MACenum mStatus = m_SUCCESS);	void mlme_associate_response(IE3ADDR DeviceAddress,UINT_16 AssocShortAddress,MACenum Status,bool SecurityEnable,				     bool frUpper = false,PHYenum status = p_SUCCESS);	void mlme_disassociate_request(IE3ADDR DeviceAddress,UINT_8 DisassociateReason,bool SecurityEnable,bool frUpper = false,PHYenum status = p_SUCCESS);	void mlme_orphan_response(IE3ADDR OrphanAddress,UINT_16 ShortAddress,bool AssociatedMember,bool SecurityEnable,bool frUpper = false,PHYenum status = p_SUCCESS);	void mlme_reset_request(bool SetDefaultPIB,bool frUpper = false,PHYenum status = p_SUCCESS);	void mlme_rx_enable_request(bool DeferPermit,UINT_32 RxOnTime,UINT_32 RxOnDuration,bool frUpper = false,PHYenum status = p_SUCCESS);	void mlme_scan_request(UINT_8 ScanType,UINT_32 ScanChannels,UINT_8 ScanDuration,bool frUpper = false,PHYenum status = p_SUCCESS);	void mlme_start_request(UINT_16 PANId,UINT_8 LogicalChannel,UINT_8 BeaconOrder,				UINT_8 SuperframeOrder,bool PANCoordinator,bool BatteryLifeExtension,				bool CoordRealignment,bool SecurityEnable,				bool frUpper = false,PHYenum status = p_SUCCESS);	void mlme_sync_request(UINT_8 LogicalChannel, bool TrackBeacon,bool frUpper = false,PHYenum status = p_SUCCESS);	void mlme_poll_request(UINT_8 CoordAddrMode,UINT_16 CoordPANId,IE3ADDR CoordAddress,bool SecurityEnable,			       bool autoRequest = false,bool firstTime = false,PHYenum status = p_SUCCESS);	void csmacaBegin(char pktType);	void csmacaResume(void);	void csmacaCallBack(PHYenum status);	int getBattLifeExtSlotNum(void);	double getCAP(bool small);	double getCAPbyType(int type);	bool canProceedWOcsmaca(Packet *p);	//can we proceed w/o CSMA-CA?	void transmitCmdData(void);	void reset_TRX(const char *frFile,const char *frFunc,int line);	void taskSuccess(char task,bool csmacaRes = true);	void taskFailed(char task,MACenum status,bool csmacaRes = true);	void freePkt(Packet *pkt);	UINT_8 macHeaderLen(UINT_16 FrmCtrl);	void constructACK(Packet *p);	void constructMPDU(UINT_8 msduLength,Packet *msdu, UINT_16 FrmCtrl,UINT_8 BDSN,panAddrInfo DstAddrInfo,			    panAddrInfo SrcAddrInfo,UINT_16 SuperSpec,UINT_8 CmdType,UINT_16 FCS);	void constructCommandHeader(Packet *p,FrameCtrl *frmCtrl,UINT_8 CmdType,				   UINT_8 dstAddrMode,UINT_16 dstPANId,IE3ADDR dstAddr,				   UINT_8 srcAddrMode,UINT_16 srcPANId,IE3ADDR srcAddr,				   bool secuEnable,bool pending,bool ackreq);	void log(Packet *p);	void resetCounter(int dst);	int command(int argc, const char*const* argv);	void changeNodeColor(double atTime,const char *newColor,bool save = true);	void txBcnCmdDataHandler(void);	void IFSHandler(void);	void backoffBoundHandler(void);public:	static bool verbose;	static UINT_8 txOption;		//0x02=GTS; 0x04=Indirect; 0x00=Direct (only for 802.15.4-unaware upper layer app. packet)	static bool ack4data;	static UINT_8 callBack;		//0=no call back; 1=call back for failures; 2=call back for failures and successes	static UINT_32 DBG_UID;protected:	taskPending taskP;	MAC_PIB mpib;	PHY_PIB tmp_ppib;	DevCapability capability;		//device capability (refer to Figure 49)	//--- for beacon ---	//(most are temp. variables which should be populated before being used)	bool secuBeacon;	SuperframeSpec sfSpec,sfSpec2,sfSpec3;	//superframe specification	GTSSpec gtsSpec,gtsSpec2;		//GTS specification	PendAddrSpec pendAddrSpec;		//pending address specification	UINT_8 beaconPeriods,beaconPeriods2;	//# of backoff periods it takes to transmit the beacon	PAN_ELE	panDes,panDes2;			//PAN descriptor	Packet *rxBeacon;			//the beacon packet just received	double	macBcnTxTime;			//the time last beacon sent (in symbol) (we use this double variable instead of integer mpib.macBeaconTxTime for accuracy reason)	double	macBcnRxTime;			//the time last beacon received from within PAN (in symbol)	double	macBcnOtherRxTime;		//the time last beacon received from outside PAN (in symbol)	//To support beacon enabled mode in multi-hop envirionment, we use {<mpib.macBeaconOrder>,<mpib.macSuperframeOrder>}	//for coordinators (transmitting beacons) and the following two parameters for devices (receiving beacons). Note that,	//in such an environment, a node can act as a coordinator and a device at the same time. More complicated algorithm 	//is required for slotted CSMA-CA in this case.	//(does 802.15.4 have this in mind?) 	UINT_8	macBeaconOrder2;	UINT_8	macSuperframeOrder2;	UINT_8	macBeaconOrder3;	UINT_8	macSuperframeOrder3;	bool	oneMoreBeacon;				UINT_8	numLostBeacons;			//# of beacons lost in a row	//------------------	UINT_16	rt_myNodeID;				UINT_8 energyLevel;				//for association and transaction	DEVICELINK *deviceLink1;	DEVICELINK *deviceLink2;	TRANSACLINK *transacLink1;	TRANSACLINK *transacLink2;private:	IE3ADDR aExtendedAddress;	//timers	macTxOverTimer *txOverT;	macTxTimer *txT;	macExtractTimer *extractT;	macAssoRspWaitTimer *assoRspWaitT;	macDataWaitTimer *dataWaitT;	macRxEnableTimer *rxEnableT;	macScanTimer *scanT;	macBeaconTxTimer *bcnTxT;		//beacon transmission timer	macBeaconRxTimer *bcnRxT;		//beacon reception timer	macBeaconSearchTimer *bcnSearchT;	//beacon search timer	//handlers	Mac802_15_4Handler txCmdDataH;	Mac802_15_4Handler IFSH;	Mac802_15_4Handler backoffBoundH;	bool isPANCoor;			//is a PAN coordinator?	Phy802_15_4 *phy;	CsmaCA802_15_4 *csmaca;	SSCS802_15_4 *sscs;	Nam802_15_4 *nam;	PHYenum trx_state_req;		//tranceiver state required: TRX_OFF/TX_ON/RX_ON	bool inTransmission;		//in the middle of transmission	bool beaconWaiting;		//it's about time to transmit beacon (suppress all other transmissions)	Packet *txBeacon;		//beacon packet to be transmitted (w/o using CSMA-CA)	Packet *txAck;			//ack. packet to be transmitted (no waiting)	Packet *txBcnCmd;		//beacon or command packet waiting for transmission (using CSMA-CA) -- triggered by receiving a packet	Packet *txBcnCmd2;		//beacon or command packet waiting for transmission (using CSMA-CA) -- triggered by upper layer	Packet *txData;			//data packet waiting for transmission (using CSMA-CA)	Packet *txCsmaca;		//for which packet (txBcnCmd/txBcnCmd2/txData) is CSMA-CA performed	Packet *txPkt;			//packet (any type) currently being transmitted	Packet *rxData;			//data packet received (waiting for passing up)	Packet *rxCmd;			//command packet received (will be handled after the transmission of ack.)	UINT_32	txPkt_uid;		//for debug purpose	double rxDataTime;		//the time when data packet received by MAC	bool waitBcnCmdAck;		//only used if (txBcnCmd): waiting for an ack. or not	bool waitBcnCmdAck2;		//only used if (txBcnCmd2): waiting for an ack. or not	bool waitDataAck;		//only used if (txData): waiting for an ack. or not	UINT_8 backoffStatus;		//0=no backoff yet;1=backoff successful;2=backoff failed;99=in the middle of backoff	UINT_8 numDataRetry;		//# of retries (retransmissions) for data packet	UINT_8 numBcnCmdRetry;		//# of retries (retransmissions) for beacon or command packet	UINT_8 numBcnCmdRetry2;		//# of retries (retransmissions) for beacon or command packet	NsObject *logtarget_;	//packet duplication detection	HLISTLINK *hlistBLink1;	HLISTLINK *hlistBLink2;	HLISTLINK *hlistDLink1;	HLISTLINK *hlistDLink2;};#define plme_set_trx_state_request(state) \set_trx_state_request(state,__FILE__,__FUNCTION__,__LINE__)#define resetTRX() \reset_TRX(__FILE__,__FUNCTION__,__LINE__)#endif// End of file: p802_15_4mac.h

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -