• Main Page
  • Classes
  • Files
  • File List

/Users/yzchen/ns/ns-allinone-2.33/ns-2.33/wpan/p802_15_4mac.h

00001 /********************************************/
00002 /*     NS2 Simulator for IEEE 802.15.4      */
00003 /*           (per P802.15.4/D18)            */
00004 /*------------------------------------------*/
00005 /* by:        Jianliang Zheng               */
00006 /*        (zheng@ee.ccny.cuny.edu)          */
00007 /*              Myung J. Lee                */
00008 /*          (lee@ccny.cuny.edu)             */
00009 /*        ~~~~~~~~~~~~~~~~~~~~~~~~~         */
00010 /*           SAIT-CUNY Joint Lab            */
00011 /********************************************/
00012 
00013 // File:  p802_15_4mac.h
00014 // Mode:  C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t
00015 
00016 // $Header: /cvsroot/nsnam/ns-2/wpan/p802_15_4mac.h,v 1.3 2007/01/30 05:00:52 tom_henderson Exp $
00017 
00018 /*
00019  * Copyright (c) 2003-2004 Samsung Advanced Institute of Technology and
00020  * The City University of New York. All rights reserved.
00021  *
00022  * Redistribution and use in source and binary forms, with or without
00023  * modification, are permitted provided that the following conditions
00024  * are met:
00025  * 1. Redistributions of source code must retain the above copyright
00026  *    notice, this list of conditions and the following disclaimer.
00027  * 2. Redistributions in binary form must reproduce the above copyright
00028  *    notice, this list of conditions and the following disclaimer in the
00029  *    documentation and/or other materials provided with the distribution.
00030  * 3. All advertising materials mentioning features or use of this software
00031  *    must display the following acknowledgement:
00032  *      This product includes software developed by the Joint Lab of Samsung 
00033  *      Advanced Institute of Technology and The City University of New York.
00034  * 4. Neither the name of Samsung Advanced Institute of Technology nor of 
00035  *    The City University of New York may be used to endorse or promote 
00036  *    products derived from this software without specific prior written 
00037  *    permission.
00038  *
00039  * THIS SOFTWARE IS PROVIDED BY THE JOINT LAB OF SAMSUNG ADVANCED INSTITUTE
00040  * OF TECHNOLOGY AND THE CITY UNIVERSITY OF NEW YORK ``AS IS'' AND ANY EXPRESS 
00041  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
00042  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN 
00043  * NO EVENT SHALL SAMSUNG ADVANCED INSTITUTE OR THE CITY UNIVERSITY OF NEW YORK 
00044  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
00045  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 
00046  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
00047  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
00048  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 
00049  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
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 //Elements of PAN descriptor (Table 41)
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         //add one field for cluster tree
00081         UINT_16 clusTreeDepth;
00082 };
00083 
00084 //task pending (callback)
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                                 // shutup the compiler.
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                                 // shutup compiler.
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                                 // shutup compiler.
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 //Elements of ACL entry descriptor (Table 73)
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 //MAC enumerations description (Table 64)
00347 typedef enum
00348 {
00349         m_SUCCESS = 0,
00350         //--- following from Table 68) ---
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                     //we added this for handling any case not specified in the draft
00376 }MACenum;
00377 
00378 //MAC PIB attributes (Tables 71,72)
00379 typedef enum {
00380         //attributes from Table 71
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         //attributes from Table 72 (security attributes)
00404         macACLEntryDescriptorSet,
00405         macACLEntryDescriptorSetSize,
00406         macDefaultSecurity,
00407         macACLDefaultSecurityMaterialLength,
00408         macDefaultSecurityMaterial,
00409         macDefaultSecuritySuite,
00410         macSecurityMode
00411 }MPIBAenum;
00412 
00413 struct MAC_PIB
00414 {
00415         //attributes from Table 71
00416         UINT_8  macAckWaitDuration;
00417         bool    macAssociationPermit;
00418         bool    macAutoRequest;
00419         bool    macBattLifeExt;
00420         UINT_8  macBattLifeExtPeriods;
00421         /*
00422         UINT_8  macBeaconPayload[aMaxPHYPacketSize-(6+9+2+1)+1];        //beacon length in octets (w/o payload):
00423                                                                         //      max: 6(phy) + 15(mac) + 23 (GTSs) + 57 (pending addresses)
00424                                                                         //      min: 6(phy) + 9(mac) + 2 (GTSs) + 1 (pending addresses)
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         //attributes from Table 72 (security attributes)
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; // 2.31 change: 
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         //interfaces between MAC and PHY
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         //interfaces between MAC and SSCS (or some other upper layer)
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 /*TBD*/ void MLME_GTS_request(UINT_8 GTSCharacteristics,bool SecurityEnable);
00530 /*TBD*/ void MLME_GTS_confirm(UINT_8 GTSCharacteristics,MACenum status);
00531 /*TBD*/ 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);               //transmission over timer handler
00560         void txHandler(void);                   //ack expiration timer handler
00561         void extractHandler(void);              //data extraction timer handler
00562         void assoRspWaitHandler(void);          //association response wait timer handler
00563         void dataWaitHandler(void);             //data wait timer handler (for indirect transmission)
00564         void rxEnableHandler(void);             //receiver enable timer handler
00565         void scanHandler(void);                 //scan done for current channel
00566         void beaconTxHandler(bool forTX);       //periodic beacon transmission
00567         void beaconRxHandler(void);             //periodic beacon reception
00568         void beaconSearchHandler(void);         //beacon searching times out during synchronization
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);     //can we proceed w/o CSMA-CA?
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;         //0x02=GTS; 0x04=Indirect; 0x00=Direct (only for 802.15.4-unaware upper layer app. packet)
00628         static bool ack4data;
00629         static UINT_8 callBack;         //0=no call back; 1=call back for failures; 2=call back for failures and successes
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;               //device capability (refer to Figure 49)
00638 
00639         //--- for beacon ---
00640         //(most are temp. variables which should be populated before being used)
00641         bool secuBeacon;
00642         SuperframeSpec sfSpec,sfSpec2,sfSpec3;  //superframe specification
00643         GTSSpec gtsSpec,gtsSpec2;               //GTS specification
00644         PendAddrSpec pendAddrSpec;              //pending address specification
00645         UINT_8 beaconPeriods,beaconPeriods2;    //# of backoff periods it takes to transmit the beacon
00646         PAN_ELE panDes,panDes2;                 //PAN descriptor
00647         Packet *rxBeacon;                       //the beacon packet just received
00648         double  macBcnTxTime;                   //the time last beacon sent (in symbol) (we use this double variable instead of integer mpib.macBeaconTxTime for accuracy reason)
00649         double  macBcnRxTime;                   //the time last beacon received from within PAN (in symbol)
00650         double  macBcnOtherRxTime;              //the time last beacon received from outside PAN (in symbol)
00651         //To support beacon enabled mode in multi-hop envirionment, we use {<mpib.macBeaconOrder>,<mpib.macSuperframeOrder>}
00652         //for coordinators (transmitting beacons) and the following two parameters for devices (receiving beacons). Note that,
00653         //in such an environment, a node can act as a coordinator and a device at the same time. More complicated algorithm 
00654         //is required for slotted CSMA-CA in this case.
00655         //(does 802.15.4 have this in mind?) 
00656         UINT_8  macBeaconOrder2;
00657         UINT_8  macSuperframeOrder2;
00658         UINT_8  macBeaconOrder3;
00659         UINT_8  macSuperframeOrder3;
00660         bool    oneMoreBeacon;                  
00661         UINT_8  numLostBeacons;                 //# of beacons lost in a row
00662         //------------------
00663         UINT_16 rt_myNodeID;                    
00664 
00665         UINT_8 energyLevel;                     
00666 
00667         //for association and transaction
00668         DEVICELINK *deviceLink1;
00669         DEVICELINK *deviceLink2;
00670         TRANSACLINK *transacLink1;
00671         TRANSACLINK *transacLink2;
00672 
00673 private:
00674         IE3ADDR aExtendedAddress;
00675 
00676         //timers
00677         macTxOverTimer *txOverT;
00678         macTxTimer *txT;
00679         macExtractTimer *extractT;
00680         macAssoRspWaitTimer *assoRspWaitT;
00681         macDataWaitTimer *dataWaitT;
00682         macRxEnableTimer *rxEnableT;
00683         macScanTimer *scanT;
00684         macBeaconTxTimer *bcnTxT;               //beacon transmission timer
00685         macBeaconRxTimer *bcnRxT;               //beacon reception timer
00686         macBeaconSearchTimer *bcnSearchT;       //beacon search timer
00687         macWakeupTimer *wakeupT;                // 2.31 change:
00688 
00689         //handlers
00690         Mac802_15_4Handler txCmdDataH;
00691         Mac802_15_4Handler IFSH;
00692         Mac802_15_4Handler backoffBoundH;
00693 
00694         bool isPANCoor;                 //is a PAN coordinator?
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;          //tranceiver state required: TRX_OFF/TX_ON/RX_ON
00700         bool inTransmission;            //in the middle of transmission
00701         bool beaconWaiting;             //it's about time to transmit beacon (suppress all other transmissions)
00702         Packet *txBeacon;               //beacon packet to be transmitted (w/o using CSMA-CA)
00703         Packet *txAck;                  //ack. packet to be transmitted (no waiting)
00704         Packet *txBcnCmd;               //beacon or command packet waiting for transmission (using CSMA-CA) -- triggered by receiving a packet
00705         Packet *txBcnCmd2;              //beacon or command packet waiting for transmission (using CSMA-CA) -- triggered by upper layer
00706         Packet *txData;                 //data packet waiting for transmission (using CSMA-CA)
00707         Packet *txCsmaca;               //for which packet (txBcnCmd/txBcnCmd2/txData) is CSMA-CA performed
00708         Packet *txPkt;                  //packet (any type) currently being transmitted
00709         Packet *rxData;                 //data packet received (waiting for passing up)
00710         Packet *rxCmd;                  //command packet received (will be handled after the transmission of ack.)
00711         UINT_32 txPkt_uid;              //for debug purpose
00712         double rxDataTime;              //the time when data packet received by MAC
00713         bool waitBcnCmdAck;             //only used if (txBcnCmd): waiting for an ack. or not
00714         bool waitBcnCmdAck2;            //only used if (txBcnCmd2): waiting for an ack. or not
00715         bool waitDataAck;               //only used if (txData): waiting for an ack. or not
00716         UINT_8 backoffStatus;           //0=no backoff yet;1=backoff successful;2=backoff failed;99=in the middle of backoff
00717         UINT_8 numDataRetry;            //# of retries (retransmissions) for data packet
00718         UINT_8 numBcnCmdRetry;          //# of retries (retransmissions) for beacon or command packet
00719         UINT_8 numBcnCmdRetry2;         //# of retries (retransmissions) for beacon or command packet
00720 
00721         NsObject *logtarget_;
00722 
00723         //packet duplication detection
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 // End of file: p802_15_4mac.h

Generated on Tue Aug 10 2010 16:16:09 for ns-2.33 by  doxygen 1.7.1