00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 #ifndef p802_15_4mac_h
00054 #define p802_15_4mac_h
00055
00056 #include "p802_15_4pkt.h"
00057 #include "p802_15_4phy.h"
00058 #include "p802_15_4timer.h"
00059 #include "p802_15_4hlist.h"
00060 #include "p802_15_4transac.h"
00061
00062
00063 struct PAN_ELE
00064 {
00065 UINT_8 CoordAddrMode;
00066 UINT_16 CoordPANId;
00067 union
00068 {
00069 UINT_16 CoordAddress_16;
00070 IE3ADDR CoordAddress_64;
00071 };
00072 UINT_8 LogicalChannel;
00073 UINT_16 SuperframeSpec;
00074 bool GTSPermit;
00075 UINT_8 LinkQuality;
00076 UINT_32 TimeStamp:24;
00077 bool SecurityUse;
00078 UINT_8 ACLEntry;
00079 bool SecurityFailure;
00080
00081 UINT_16 clusTreeDepth;
00082 };
00083
00084
00085 #define TP_mcps_data_request 1
00086 #define TP_mlme_associate_request 2
00087 #define TP_mlme_associate_response 3
00088 #define TP_mlme_disassociate_request 4
00089 #define TP_mlme_orphan_response 5
00090 #define TP_mlme_reset_request 6
00091 #define TP_mlme_rx_enable_request 7
00092 #define TP_mlme_scan_request 8
00093 #define TP_mlme_start_request 9
00094 #define TP_mlme_sync_request 10
00095 #define TP_mlme_poll_request 11
00096 #define TP_CCA_csmaca 12
00097 #define TP_RX_ON_csmaca 13
00098 struct taskPending
00099 {
00100 taskPending()
00101 {
00102 init();
00103 }
00104 inline void init()
00105 {
00106 mcps_data_request = false;
00107 mcps_data_request_STEP = 0;
00108 mlme_associate_request = false;
00109 mlme_associate_request_STEP = 0;
00110 mlme_associate_response = false;
00111 mlme_associate_response_STEP = 0;
00112 mlme_disassociate_request = false;
00113 mlme_disassociate_request_STEP = 0;
00114 mlme_orphan_response = false;
00115 mlme_orphan_response_STEP = 0;
00116 mlme_reset_request = false;
00117 mlme_reset_request_STEP = 0;
00118 mlme_rx_enable_request = false;
00119 mlme_rx_enable_request_STEP = 0;
00120 mlme_scan_request = false;
00121 mlme_scan_request_STEP = 0;
00122 mlme_start_request = false;
00123 mlme_start_request_STEP = 0;
00124 mlme_sync_request = false;
00125 mlme_sync_request_STEP = 0;
00126 mlme_sync_request_tracking = false;
00127 mlme_poll_request = false;
00128 mlme_poll_request_STEP = 0;
00129 CCA_csmaca = false;
00130 CCA_csmaca_STEP = 0;
00131 RX_ON_csmaca = false;
00132 RX_ON_csmaca_STEP = 0;
00133 }
00134
00135 bool &taskStatus(UINT_8 task)
00136 {
00137 switch (task)
00138 {
00139 case TP_mcps_data_request:
00140 return mcps_data_request;
00141 case TP_mlme_associate_request:
00142 return mlme_associate_request;
00143 case TP_mlme_associate_response:
00144 return mlme_associate_response;
00145 case TP_mlme_disassociate_request:
00146 return mlme_disassociate_request;
00147 case TP_mlme_orphan_response:
00148 return mlme_orphan_response;
00149 case TP_mlme_reset_request:
00150 return mlme_reset_request;
00151 case TP_mlme_rx_enable_request:
00152 return mlme_rx_enable_request;
00153 case TP_mlme_scan_request:
00154 return mlme_scan_request;
00155 case TP_mlme_start_request:
00156 return mlme_start_request;
00157 case TP_mlme_sync_request:
00158 return mlme_sync_request;
00159 case TP_mlme_poll_request:
00160 return mlme_poll_request;
00161 case TP_CCA_csmaca:
00162 return CCA_csmaca;
00163 case TP_RX_ON_csmaca:
00164 return RX_ON_csmaca;
00165 default:
00166 assert(0);
00167
00168 return RX_ON_csmaca;
00169 }
00170 }
00171
00172 UINT_8 &taskStep(UINT_8 task)
00173 {
00174 switch (task)
00175 {
00176 case TP_mcps_data_request:
00177 return mcps_data_request_STEP;
00178 case TP_mlme_associate_request:
00179 return mlme_associate_request_STEP;
00180 case TP_mlme_associate_response:
00181 return mlme_associate_response_STEP;
00182 case TP_mlme_disassociate_request:
00183 return mlme_disassociate_request_STEP;
00184 case TP_mlme_orphan_response:
00185 return mlme_orphan_response_STEP;
00186 case TP_mlme_reset_request:
00187 return mlme_reset_request_STEP;
00188 case TP_mlme_rx_enable_request:
00189 return mlme_rx_enable_request_STEP;
00190 case TP_mlme_scan_request:
00191 return mlme_scan_request_STEP;
00192 case TP_mlme_start_request:
00193 return mlme_start_request_STEP;
00194 case TP_mlme_sync_request:
00195 return mlme_sync_request_STEP;
00196 case TP_mlme_poll_request:
00197 return mlme_poll_request_STEP;
00198 case TP_CCA_csmaca:
00199 return CCA_csmaca_STEP;
00200 case TP_RX_ON_csmaca:
00201 return RX_ON_csmaca_STEP;
00202 default:
00203 assert(0);
00204
00205 return RX_ON_csmaca_STEP;
00206 }
00207 }
00208
00209 char *taskFrFunc(UINT_8 task)
00210 {
00211 switch (task)
00212 {
00213 case TP_mcps_data_request:
00214 return mcps_data_request_frFunc;
00215 case TP_mlme_associate_request:
00216 return mlme_associate_request_frFunc;
00217 case TP_mlme_associate_response:
00218 return mlme_associate_response_frFunc;
00219 case TP_mlme_disassociate_request:
00220 return mlme_disassociate_request_frFunc;
00221 case TP_mlme_orphan_response:
00222 return mlme_orphan_response_frFunc;
00223 case TP_mlme_reset_request:
00224 return mlme_reset_request_frFunc;
00225 case TP_mlme_rx_enable_request:
00226 return mlme_rx_enable_request_frFunc;
00227 case TP_mlme_scan_request:
00228 return mlme_scan_request_frFunc;
00229 case TP_mlme_start_request:
00230 return mlme_start_request_frFunc;
00231 case TP_mlme_sync_request:
00232 return mlme_sync_request_frFunc;
00233 case TP_mlme_poll_request:
00234 return mlme_poll_request_frFunc;
00235 default:
00236 assert(0);
00237
00238 return mlme_poll_request_frFunc;
00239 }
00240 }
00241
00242
00243 bool mcps_data_request;
00244 UINT_8 mcps_data_request_STEP;
00245 char mcps_data_request_frFunc[81];
00246 UINT_8 mcps_data_request_TxOptions;
00247 Packet *mcps_data_request_pendPkt;
00248
00249 bool mlme_associate_request;
00250 UINT_8 mlme_associate_request_STEP;
00251 char mlme_associate_request_frFunc[81];
00252 bool mlme_associate_request_SecurityEnable;
00253 UINT_8 mlme_associate_request_CoordAddrMode;
00254 Packet *mlme_associate_request_pendPkt;
00255
00256 bool mlme_associate_response;
00257 UINT_8 mlme_associate_response_STEP;
00258 char mlme_associate_response_frFunc[81];
00259 IE3ADDR mlme_associate_response_DeviceAddress;
00260 Packet *mlme_associate_response_pendPkt;
00261
00262 bool mlme_disassociate_request;
00263 UINT_8 mlme_disassociate_request_STEP;
00264 char mlme_disassociate_request_frFunc[81];
00265 bool mlme_disassociate_request_toCoor;
00266 Packet *mlme_disassociate_request_pendPkt;
00267
00268 bool mlme_orphan_response;
00269 UINT_8 mlme_orphan_response_STEP;
00270 char mlme_orphan_response_frFunc[81];
00271 IE3ADDR mlme_orphan_response_OrphanAddress;
00272
00273 bool mlme_reset_request;
00274 UINT_8 mlme_reset_request_STEP;
00275 char mlme_reset_request_frFunc[81];
00276 bool mlme_reset_request_SetDefaultPIB;
00277
00278 bool mlme_rx_enable_request;
00279 UINT_8 mlme_rx_enable_request_STEP;
00280 char mlme_rx_enable_request_frFunc[81];
00281 UINT_32 mlme_rx_enable_request_RxOnTime;
00282 UINT_32 mlme_rx_enable_request_RxOnDuration;
00283 double mlme_rx_enable_request_currentTime;
00284
00285 bool mlme_scan_request;
00286 UINT_8 mlme_scan_request_STEP;
00287 char mlme_scan_request_frFunc[81];
00288 UINT_8 mlme_scan_request_ScanType;
00289 UINT_8 mlme_scan_request_orig_macBeaconOrder;
00290 UINT_8 mlme_scan_request_orig_macBeaconOrder2;
00291 UINT_8 mlme_scan_request_orig_macBeaconOrder3;
00292 UINT_16 mlme_scan_request_orig_macPANId;
00293 UINT_32 mlme_scan_request_ScanChannels;
00294 UINT_8 mlme_scan_request_ScanDuration;
00295 UINT_8 mlme_scan_request_CurrentChannel;
00296 UINT_8 mlme_scan_request_ListNum;
00297 UINT_8 mlme_scan_request_EnergyDetectList[27];
00298 PAN_ELE mlme_scan_request_PANDescriptorList[27];
00299
00300 bool mlme_start_request;
00301 UINT_8 mlme_start_request_STEP;
00302 char mlme_start_request_frFunc[81];
00303 UINT_8 mlme_start_request_BeaconOrder;
00304 UINT_8 mlme_start_request_SuperframeOrder;
00305 bool mlme_start_request_BatteryLifeExtension;
00306 bool mlme_start_request_SecurityEnable;
00307 bool mlme_start_request_PANCoordinator;
00308 UINT_16 mlme_start_request_PANId;
00309 UINT_8 mlme_start_request_LogicalChannel;
00310
00311 bool mlme_sync_request;
00312 UINT_8 mlme_sync_request_STEP;
00313 char mlme_sync_request_frFunc[81];
00314 UINT_8 mlme_sync_request_numSearchRetry;
00315 bool mlme_sync_request_tracking;
00316
00317 bool mlme_poll_request;
00318 UINT_8 mlme_poll_request_STEP;
00319 char mlme_poll_request_frFunc[81];
00320 UINT_8 mlme_poll_request_CoordAddrMode;
00321 UINT_16 mlme_poll_request_CoordPANId;
00322 IE3ADDR mlme_poll_request_CoordAddress;
00323 bool mlme_poll_request_SecurityEnable;
00324 bool mlme_poll_request_autoRequest;
00325 bool mlme_poll_request_pending;
00326
00327 bool CCA_csmaca;
00328 UINT_8 CCA_csmaca_STEP;
00329
00330 bool RX_ON_csmaca;
00331 UINT_8 RX_ON_csmaca_STEP;
00332
00333 };
00334
00335
00336 struct MAC_ACL
00337 {
00338 IE3ADDR ACLExtendedAddress;
00339 UINT_16 ACLShortAddress;
00340 UINT_16 ACLPANId;
00341 UINT_8 ACLSecurityMaterialLength;
00342 UINT_8 *ACLSecurityMaterial;
00343 UINT_8 ACLSecuritySuite;
00344 };
00345
00346
00347 typedef enum
00348 {
00349 m_SUCCESS = 0,
00350
00351 m_PAN_at_capacity,
00352 m_PAN_access_denied,
00353
00354 m_BEACON_LOSS = 0xe0,
00355 m_CHANNEL_ACCESS_FAILURE,
00356 m_DENIED,
00357 m_DISABLE_TRX_FAILURE,
00358 m_FAILED_SECURITY_CHECK,
00359 m_FRAME_TOO_LONG,
00360 m_INVALID_GTS,
00361 m_INVALID_HANDLE,
00362 m_INVALID_PARAMETER,
00363 m_NO_ACK,
00364 m_NO_BEACON,
00365 m_NO_DATA,
00366 m_NO_SHORT_ADDRESS,
00367 m_OUT_OF_CAP,
00368 m_PAN_ID_CONFLICT,
00369 m_REALIGNMENT,
00370 m_TRANSACTION_EXPIRED,
00371 m_TRANSACTION_OVERFLOW,
00372 m_TX_ACTIVE,
00373 m_UNAVAILABLE_KEY,
00374 m_UNSUPPORTED_ATTRIBUTE,
00375 m_UNDEFINED
00376 }MACenum;
00377
00378
00379 typedef enum {
00380
00381 macAckWaitDuration,
00382 macAssociationPermit,
00383 macAutoRequest,
00384 macBattLifeExt,
00385 macBattLifeExtPeriods,
00386 macBeaconPayload,
00387 macBeaconPayloadLength,
00388 macBeaconOrder,
00389 macBeaconTxTime,
00390 macBSN,
00391 macCoordExtendedAddress,
00392 macCoordShortAddress,
00393 macDSN,
00394 macGTSPermit,
00395 macMaxCSMABackoffs,
00396 macMinBE,
00397 macPANId,
00398 macPromiscuousMode,
00399 macRxOnWhenIdle,
00400 macShortAddress,
00401 macSuperframeOrder,
00402 macTransactionPersistenceTime,
00403
00404 macACLEntryDescriptorSet,
00405 macACLEntryDescriptorSetSize,
00406 macDefaultSecurity,
00407 macACLDefaultSecurityMaterialLength,
00408 macDefaultSecurityMaterial,
00409 macDefaultSecuritySuite,
00410 macSecurityMode
00411 }MPIBAenum;
00412
00413 struct MAC_PIB
00414 {
00415
00416 UINT_8 macAckWaitDuration;
00417 bool macAssociationPermit;
00418 bool macAutoRequest;
00419 bool macBattLifeExt;
00420 UINT_8 macBattLifeExtPeriods;
00421
00422
00423
00424
00425
00426 UINT_8 macBeaconPayload[aMaxBeaconPayloadLength+1];
00427 UINT_8 macBeaconPayloadLength;
00428 UINT_8 macBeaconOrder;
00429 UINT_32 macBeaconTxTime:24;
00430 UINT_8 macBSN;
00431 IE3ADDR macCoordExtendedAddress;
00432 UINT_16 macCoordShortAddress;
00433 UINT_8 macDSN;
00434 bool macGTSPermit;
00435 UINT_8 macMaxCSMABackoffs;
00436 UINT_8 macMinBE;
00437 UINT_16 macPANId;
00438 bool macPromiscuousMode;
00439 bool macRxOnWhenIdle;
00440 UINT_16 macShortAddress;
00441 UINT_8 macSuperframeOrder;
00442 UINT_16 macTransactionPersistenceTime;
00443
00444 MAC_ACL *macACLEntryDescriptorSet;
00445 UINT_8 macACLEntryDescriptorSetSize;
00446 bool macDefaultSecurity;
00447 UINT_8 macACLDefaultSecurityMaterialLength;
00448 UINT_8 *macDefaultSecurityMaterial;
00449 UINT_8 macDefaultSecuritySuite;
00450 UINT_8 macSecurityMode;
00451 };
00452
00453 #define macTxBcnCmdDataHType 1
00454 #define macIFSHType 2
00455 #define macBackoffBoundType 3
00456 class Mac802_15_4;
00457 class Mac802_15_4Handler : public Handler
00458 {
00459 friend class Mac802_15_4;
00460 public:
00461 Mac802_15_4Handler(Mac802_15_4 *m, int tp) : Handler()
00462 {
00463 mac = m;
00464 type = tp;
00465 nullEvent.uid_ = 0;
00466 }
00467 virtual void handle(Event* e);
00468
00469 protected:
00470 Mac802_15_4 *mac;
00471 int type;
00472 Event nullEvent;
00473 };
00474
00475 #define TxOp_Acked 0x01
00476 #define TxOp_GTS 0x02
00477 #define TxOp_Indirect 0x04
00478 #define TxOp_SecEnabled 0x08
00479 class Phy802_15_4;
00480 class CsmaCA802_15_4;
00481 class SSCS802_15_4;
00482 class Nam802_15_4;
00483 class Mac802_15_4 : public Mac
00484 {
00485 friend class Phy802_15_4;
00486 friend class Mac802_15_4Handler;
00487 friend class macTxOverTimer;
00488 friend class macTxTimer;
00489 friend class macExtractTimer;
00490 friend class macAssoRspWaitTimer;
00491 friend class macDataWaitTimer;
00492 friend class macRxEnableTimer;
00493 friend class macScanTimer;
00494 friend class macBeaconTxTimer;
00495 friend class macBeaconRxTimer;
00496 friend class macBeaconSearchTimer;
00497 friend class macWakeupTimer;
00498 friend class CsmaCA802_15_4;
00499 friend class SSCS802_15_4;
00500 friend class Nam802_15_4;
00501 public:
00502 Mac802_15_4(MAC_PIB *mp);
00503 ~Mac802_15_4();
00504 void init(bool reset = false);
00505
00506
00507 void PD_DATA_confirm(PHYenum status);
00508 void PLME_CCA_confirm(PHYenum status);
00509 void PLME_ED_confirm(PHYenum status,UINT_8 EnergyLevel);
00510 void PLME_GET_confirm(PHYenum status,PPIBAenum PIBAttribute,PHY_PIB *PIBAttributeValue);
00511 void PLME_SET_TRX_STATE_confirm(PHYenum status);
00512 void PLME_SET_confirm(PHYenum status,PPIBAenum PIBAttribute);
00513
00514
00515 void MCPS_DATA_request(UINT_8 SrcAddrMode,UINT_16 SrcPANId,IE3ADDR SrcAddr,
00516 UINT_8 DstAddrMode,UINT_16 DstPANId,IE3ADDR DstAddr,
00517 UINT_8 msduLength,Packet *msdu,UINT_8 msduHandle,UINT_8 TxOptions);
00518 void MCPS_DATA_indication(UINT_8 SrcAddrMode,UINT_16 SrcPANId,IE3ADDR SrcAddr,
00519 UINT_8 DstAddrMode,UINT_16 DstPANId,IE3ADDR DstAddr,
00520 UINT_8 msduLength,Packet *msdu,UINT_8 mpduLinkQuality,
00521 bool SecurityUse,UINT_8 ACLEntry);
00522 void MCPS_PURGE_request(UINT_8 msduHandle);
00523 void MLME_ASSOCIATE_request(UINT_8 LogicalChannel,UINT_8 CoordAddrMode,UINT_16 CoordPANId,IE3ADDR CoordAddress,
00524 UINT_8 CapabilityInformation,bool SecurityEnable);
00525 void MLME_ASSOCIATE_response(IE3ADDR DeviceAddress,UINT_16 AssocShortAddress,MACenum status,bool SecurityEnable);
00526 void MLME_DISASSOCIATE_request(IE3ADDR DeviceAddress,UINT_8 DisassociateReason,bool SecurityEnable);
00527 void MLME_DISASSOCIATE_indication(IE3ADDR DeviceAddress,UINT_8 DisassociateReason,bool SecurityUse,UINT_8 ACLEntry);
00528 void MLME_GET_request(MPIBAenum PIBAttribute);
00529 void MLME_GTS_request(UINT_8 GTSCharacteristics,bool SecurityEnable);
00530 void MLME_GTS_confirm(UINT_8 GTSCharacteristics,MACenum status);
00531 void MLME_GTS_indication(UINT_16 DevAddress,UINT_8 GTSCharacteristics,
00532 bool SecurityUse, UINT_8 ACLEntry);
00533 void MLME_ORPHAN_response(IE3ADDR OrphanAddress,UINT_16 ShortAddress,bool AssociatedMember,bool SecurityEnable);
00534 void MLME_RESET_request(bool SetDefaultPIB);
00535 void MLME_RX_ENABLE_request(bool DeferPermit,UINT_32 RxOnTime,UINT_32 RxOnDuration);
00536 void MLME_SCAN_request(UINT_8 ScanType,UINT_32 ScanChannels,UINT_8 ScanDuration);
00537 void MLME_SET_request(MPIBAenum PIBAttribute,MAC_PIB *PIBAttributeValue);
00538 void MLME_START_request(UINT_16 PANId,UINT_8 LogicalChannel,UINT_8 BeaconOrder,
00539 UINT_8 SuperframeOrder,bool PANCoordinator,bool BatteryLifeExtension,
00540 bool CoordRealignment,bool SecurityEnable);
00541 void MLME_SYNC_request(UINT_8 LogicalChannel, bool TrackBeacon);
00542 void MLME_POLL_request(UINT_8 CoordAddrMode,UINT_16 CoordPANId,IE3ADDR CoordAddress,bool SecurityEnable);
00543
00544 inline int hdr_dst(char* hdr,int dst = -2);
00545 inline int hdr_src(char* hdr,int src = -2);
00546 inline int hdr_type(char* hdr, UINT_16 type = 0);
00547
00548 inline Tap *tap(){return tap_;}
00549 void recv(Packet *p, Handler *h);
00550 void recvBeacon(Packet *p);
00551 void recvAck(Packet *p);
00552 void recvCommand(Packet *p);
00553 void recvData(Packet *p);
00554 bool toParent(Packet *p);
00555
00556 protected:
00557 void set_trx_state_request(PHYenum state,const char *frFile,const char *frFunc,int line);
00558 double locateBoundary(bool parent,double wtime);
00559 void txOverHandler(void);
00560 void txHandler(void);
00561 void extractHandler(void);
00562 void assoRspWaitHandler(void);
00563 void dataWaitHandler(void);
00564 void rxEnableHandler(void);
00565 void scanHandler(void);
00566 void beaconTxHandler(bool forTX);
00567 void beaconRxHandler(void);
00568 void beaconSearchHandler(void);
00569 void isPanCoor(bool isPC);
00570
00571 private:
00572 void checkTaskOverflow(UINT_8 task);
00573 void dispatch(PHYenum status,const char *frFunc,PHYenum req_state = p_SUCCESS,MACenum mStatus = m_SUCCESS);
00574 void sendDown(Packet *p,Handler* h);
00575 void mcps_data_request(UINT_8 SrcAddrMode,UINT_16 SrcPANId,IE3ADDR SrcAddr,
00576 UINT_8 DstAddrMode,UINT_16 DstPANId,IE3ADDR DstAddr,
00577 UINT_8 msduLength,Packet *msdu,UINT_8 msduHandle,UINT_8 TxOptions,
00578 bool frUpper = false,PHYenum status = p_SUCCESS,MACenum mStatus = m_SUCCESS);
00579 void mlme_associate_request(UINT_8 LogicalChannel,UINT_8 CoordAddrMode,UINT_16 CoordPANId,IE3ADDR CoordAddress,
00580 UINT_8 CapabilityInformation,bool SecurityEnable,
00581 bool frUpper = false,PHYenum status = p_SUCCESS,MACenum mStatus = m_SUCCESS);
00582 void mlme_associate_response(IE3ADDR DeviceAddress,UINT_16 AssocShortAddress,MACenum Status,bool SecurityEnable,
00583 bool frUpper = false,PHYenum status = p_SUCCESS);
00584 void mlme_disassociate_request(IE3ADDR DeviceAddress,UINT_8 DisassociateReason,bool SecurityEnable,bool frUpper = false,PHYenum status = p_SUCCESS);
00585 void mlme_orphan_response(IE3ADDR OrphanAddress,UINT_16 ShortAddress,bool AssociatedMember,bool SecurityEnable,bool frUpper = false,PHYenum status = p_SUCCESS);
00586 void mlme_reset_request(bool SetDefaultPIB,bool frUpper = false,PHYenum status = p_SUCCESS);
00587 void mlme_rx_enable_request(bool DeferPermit,UINT_32 RxOnTime,UINT_32 RxOnDuration,bool frUpper = false,PHYenum status = p_SUCCESS);
00588 void mlme_scan_request(UINT_8 ScanType,UINT_32 ScanChannels,UINT_8 ScanDuration,bool frUpper = false,PHYenum status = p_SUCCESS);
00589 void mlme_start_request(UINT_16 PANId,UINT_8 LogicalChannel,UINT_8 BeaconOrder,
00590 UINT_8 SuperframeOrder,bool PANCoordinator,bool BatteryLifeExtension,
00591 bool CoordRealignment,bool SecurityEnable,
00592 bool frUpper = false,PHYenum status = p_SUCCESS);
00593 void mlme_sync_request(UINT_8 LogicalChannel, bool TrackBeacon,bool frUpper = false,PHYenum status = p_SUCCESS);
00594 void mlme_poll_request(UINT_8 CoordAddrMode,UINT_16 CoordPANId,IE3ADDR CoordAddress,bool SecurityEnable,
00595 bool autoRequest = false,bool firstTime = false,PHYenum status = p_SUCCESS);
00596
00597 void csmacaBegin(char pktType);
00598 void csmacaResume(void);
00599 void csmacaCallBack(PHYenum status);
00600 int getBattLifeExtSlotNum(void);
00601 double getCAP(bool small);
00602 double getCAPbyType(int type);
00603 bool canProceedWOcsmaca(Packet *p);
00604 void transmitCmdData(void);
00605 void reset_TRX(const char *frFile,const char *frFunc,int line);
00606 void taskSuccess(char task,bool csmacaRes = true);
00607 void taskFailed(char task,MACenum status,bool csmacaRes = true);
00608 void freePkt(Packet *pkt);
00609 UINT_8 macHeaderLen(UINT_16 FrmCtrl);
00610 void constructACK(Packet *p);
00611 void constructMPDU(UINT_8 msduLength,Packet *msdu, UINT_16 FrmCtrl,UINT_8 BDSN,panAddrInfo DstAddrInfo,
00612 panAddrInfo SrcAddrInfo,UINT_16 SuperSpec,UINT_8 CmdType,UINT_16 FCS);
00613 void constructCommandHeader(Packet *p,FrameCtrl *frmCtrl,UINT_8 CmdType,
00614 UINT_8 dstAddrMode,UINT_16 dstPANId,IE3ADDR dstAddr,
00615 UINT_8 srcAddrMode,UINT_16 srcPANId,IE3ADDR srcAddr,
00616 bool secuEnable,bool pending,bool ackreq);
00617 void log(Packet *p);
00618 void resetCounter(int dst);
00619 int command(int argc, const char*const* argv);
00620 void changeNodeColor(double atTime,const char *newColor,bool save = true);
00621 void txBcnCmdDataHandler(void);
00622 void IFSHandler(void);
00623 void backoffBoundHandler(void);
00624
00625 public:
00626 static bool verbose;
00627 static UINT_8 txOption;
00628 static bool ack4data;
00629 static UINT_8 callBack;
00630 static UINT_32 DBG_UID;
00631
00632 protected:
00633
00634 taskPending taskP;
00635 MAC_PIB mpib;
00636 PHY_PIB tmp_ppib;
00637 DevCapability capability;
00638
00639
00640
00641 bool secuBeacon;
00642 SuperframeSpec sfSpec,sfSpec2,sfSpec3;
00643 GTSSpec gtsSpec,gtsSpec2;
00644 PendAddrSpec pendAddrSpec;
00645 UINT_8 beaconPeriods,beaconPeriods2;
00646 PAN_ELE panDes,panDes2;
00647 Packet *rxBeacon;
00648 double macBcnTxTime;
00649 double macBcnRxTime;
00650 double macBcnOtherRxTime;
00651
00652
00653
00654
00655
00656 UINT_8 macBeaconOrder2;
00657 UINT_8 macSuperframeOrder2;
00658 UINT_8 macBeaconOrder3;
00659 UINT_8 macSuperframeOrder3;
00660 bool oneMoreBeacon;
00661 UINT_8 numLostBeacons;
00662
00663 UINT_16 rt_myNodeID;
00664
00665 UINT_8 energyLevel;
00666
00667
00668 DEVICELINK *deviceLink1;
00669 DEVICELINK *deviceLink2;
00670 TRANSACLINK *transacLink1;
00671 TRANSACLINK *transacLink2;
00672
00673 private:
00674 IE3ADDR aExtendedAddress;
00675
00676
00677 macTxOverTimer *txOverT;
00678 macTxTimer *txT;
00679 macExtractTimer *extractT;
00680 macAssoRspWaitTimer *assoRspWaitT;
00681 macDataWaitTimer *dataWaitT;
00682 macRxEnableTimer *rxEnableT;
00683 macScanTimer *scanT;
00684 macBeaconTxTimer *bcnTxT;
00685 macBeaconRxTimer *bcnRxT;
00686 macBeaconSearchTimer *bcnSearchT;
00687 macWakeupTimer *wakeupT;
00688
00689
00690 Mac802_15_4Handler txCmdDataH;
00691 Mac802_15_4Handler IFSH;
00692 Mac802_15_4Handler backoffBoundH;
00693
00694 bool isPANCoor;
00695 Phy802_15_4 *phy;
00696 CsmaCA802_15_4 *csmaca;
00697 SSCS802_15_4 *sscs;
00698 Nam802_15_4 *nam;
00699 PHYenum trx_state_req;
00700 bool inTransmission;
00701 bool beaconWaiting;
00702 Packet *txBeacon;
00703 Packet *txAck;
00704 Packet *txBcnCmd;
00705 Packet *txBcnCmd2;
00706 Packet *txData;
00707 Packet *txCsmaca;
00708 Packet *txPkt;
00709 Packet *rxData;
00710 Packet *rxCmd;
00711 UINT_32 txPkt_uid;
00712 double rxDataTime;
00713 bool waitBcnCmdAck;
00714 bool waitBcnCmdAck2;
00715 bool waitDataAck;
00716 UINT_8 backoffStatus;
00717 UINT_8 numDataRetry;
00718 UINT_8 numBcnCmdRetry;
00719 UINT_8 numBcnCmdRetry2;
00720
00721 NsObject *logtarget_;
00722
00723
00724 HLISTLINK *hlistBLink1;
00725 HLISTLINK *hlistBLink2;
00726 HLISTLINK *hlistDLink1;
00727 HLISTLINK *hlistDLink2;
00728 };
00729
00730 #define plme_set_trx_state_request(state) \
00731 set_trx_state_request(state,__FILE__,__FUNCTION__,__LINE__)
00732 #define resetTRX() \
00733 reset_TRX(__FILE__,__FUNCTION__,__LINE__)
00734
00735 #endif
00736
00737