📄 p802_15_4mac.h
字号:
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 + -