p802_15_4mac.h

Go to the documentation of this file.
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: /nfs/jade/vint/CVSROOT/ns-2/wpan/p802_15_4mac.h,v 1.2 2005/07/13 03:51:33 tomh 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 CsmaCA802_15_4;
00498     friend class SSCS802_15_4;
00499     friend class Nam802_15_4;
00500 public:
00501     Mac802_15_4(MAC_PIB *mp);
00502     ~Mac802_15_4();
00503     void init(bool reset = false);
00504 
00505     //interfaces between MAC and PHY
00506     void PD_DATA_confirm(PHYenum status);
00507     void PLME_CCA_confirm(PHYenum status);
00508     void PLME_ED_confirm(PHYenum status,UINT_8 EnergyLevel);
00509     void PLME_GET_confirm(PHYenum status,PPIBAenum PIBAttribute,PHY_PIB *PIBAttributeValue);
00510     void PLME_SET_TRX_STATE_confirm(PHYenum status);
00511     void PLME_SET_confirm(PHYenum status,PPIBAenum PIBAttribute);
00512 
00513     //interfaces between MAC and SSCS (or some other upper layer)
00514     void MCPS_DATA_request(UINT_8 SrcAddrMode,UINT_16 SrcPANId,IE3ADDR SrcAddr,
00515                    UINT_8 DstAddrMode,UINT_16 DstPANId,IE3ADDR DstAddr,
00516                    UINT_8 msduLength,Packet *msdu,UINT_8 msduHandle,UINT_8 TxOptions);
00517     void MCPS_DATA_indication(UINT_8 SrcAddrMode,UINT_16 SrcPANId,IE3ADDR SrcAddr,
00518                   UINT_8 DstAddrMode,UINT_16 DstPANId,IE3ADDR DstAddr,
00519                   UINT_8 msduLength,Packet *msdu,UINT_8 mpduLinkQuality,
00520                   bool SecurityUse,UINT_8 ACLEntry);
00521     void MCPS_PURGE_request(UINT_8 msduHandle);
00522     void MLME_ASSOCIATE_request(UINT_8 LogicalChannel,UINT_8 CoordAddrMode,UINT_16 CoordPANId,IE3ADDR CoordAddress,
00523                     UINT_8 CapabilityInformation,bool SecurityEnable);
00524     void MLME_ASSOCIATE_response(IE3ADDR DeviceAddress,UINT_16 AssocShortAddress,MACenum status,bool SecurityEnable);
00525     void MLME_DISASSOCIATE_request(IE3ADDR DeviceAddress,UINT_8 DisassociateReason,bool SecurityEnable);
00526     void MLME_DISASSOCIATE_indication(IE3ADDR DeviceAddress,UINT_8 DisassociateReason,bool SecurityUse,UINT_8 ACLEntry);
00527     void MLME_GET_request(MPIBAenum PIBAttribute);
00528 /*TBD*/ void MLME_GTS_request(UINT_8 GTSCharacteristics,bool SecurityEnable);
00529 /*TBD*/ void MLME_GTS_confirm(UINT_8 GTSCharacteristics,MACenum status);
00530 /*TBD*/ void MLME_GTS_indication(UINT_16 DevAddress,UINT_8 GTSCharacteristics,
00531                  bool SecurityUse, UINT_8 ACLEntry);
00532     void MLME_ORPHAN_response(IE3ADDR OrphanAddress,UINT_16 ShortAddress,bool AssociatedMember,bool SecurityEnable);
00533     void MLME_RESET_request(bool SetDefaultPIB);
00534     void MLME_RX_ENABLE_request(bool DeferPermit,UINT_32 RxOnTime,UINT_32 RxOnDuration);
00535     void MLME_SCAN_request(UINT_8 ScanType,UINT_32 ScanChannels,UINT_8 ScanDuration);
00536     void MLME_SET_request(MPIBAenum PIBAttribute,MAC_PIB *PIBAttributeValue);
00537     void MLME_START_request(UINT_16 PANId,UINT_8 LogicalChannel,UINT_8 BeaconOrder,
00538                 UINT_8 SuperframeOrder,bool PANCoordinator,bool BatteryLifeExtension,
00539                 bool CoordRealignment,bool SecurityEnable);
00540     void MLME_SYNC_request(UINT_8 LogicalChannel, bool TrackBeacon);
00541     void MLME_POLL_request(UINT_8 CoordAddrMode,UINT_16 CoordPANId,IE3ADDR CoordAddress,bool SecurityEnable);
00542 
00543     inline int hdr_dst(char* hdr,int dst = -2);
00544     inline int hdr_src(char* hdr,int src = -2);
00545     inline int hdr_type(char* hdr, UINT_16 type = 0);
00546 
00547     inline Tap *tap(){return tap_;}
00548     void recv(Packet *p, Handler *h);
00549     void recvBeacon(Packet *p);
00550     void recvAck(Packet *p);
00551     void recvCommand(Packet *p);
00552     void recvData(Packet *p);
00553     bool toParent(Packet *p);
00554 
00555 protected:
00556     void set_trx_state_request(PHYenum state,const char *frFile,const char *frFunc,int line);
00557     double locateBoundary(bool parent,double wtime);
00558     void txOverHandler(void);       //transmission over timer handler
00559     void txHandler(void);           //ack expiration timer handler
00560     void extractHandler(void);      //data extraction timer handler
00561     void assoRspWaitHandler(void);      //association response wait timer handler
00562     void dataWaitHandler(void);     //data wait timer handler (for indirect transmission)
00563     void rxEnableHandler(void);     //receiver enable timer handler
00564     void scanHandler(void);         //scan done for current channel
00565     void beaconTxHandler(bool forTX);   //periodic beacon transmission
00566     void beaconRxHandler(void);     //periodic beacon reception
00567     void beaconSearchHandler(void);     //beacon searching times out during synchronization
00568     void isPanCoor(bool isPC);
00569 
00570 private:
00571     void checkTaskOverflow(UINT_8 task);
00572     void dispatch(PHYenum status,const char *frFunc,PHYenum req_state = p_SUCCESS,MACenum mStatus = m_SUCCESS);
00573     void sendDown(Packet *p,Handler* h);
00574     void mcps_data_request(UINT_8 SrcAddrMode,UINT_16 SrcPANId,IE3ADDR SrcAddr,
00575                    UINT_8 DstAddrMode,UINT_16 DstPANId,IE3ADDR DstAddr,
00576                    UINT_8 msduLength,Packet *msdu,UINT_8 msduHandle,UINT_8 TxOptions,
00577                    bool frUpper = false,PHYenum status = p_SUCCESS,MACenum mStatus = m_SUCCESS);
00578     void mlme_associate_request(UINT_8 LogicalChannel,UINT_8 CoordAddrMode,UINT_16 CoordPANId,IE3ADDR CoordAddress,
00579                     UINT_8 CapabilityInformation,bool SecurityEnable,
00580                     bool frUpper = false,PHYenum status = p_SUCCESS,MACenum mStatus = m_SUCCESS);
00581     void mlme_associate_response(IE3ADDR DeviceAddress,UINT_16 AssocShortAddress,MACenum Status,bool SecurityEnable,
00582                      bool frUpper = false,PHYenum status = p_SUCCESS);
00583     void mlme_disassociate_request(IE3ADDR DeviceAddress,UINT_8 DisassociateReason,bool SecurityEnable,bool frUpper = false,PHYenum status = p_SUCCESS);
00584     void mlme_orphan_response(IE3ADDR OrphanAddress,UINT_16 ShortAddress,bool AssociatedMember,bool SecurityEnable,bool frUpper = false,PHYenum status = p_SUCCESS);
00585     void mlme_reset_request(bool SetDefaultPIB,bool frUpper = false,PHYenum status = p_SUCCESS);
00586     void mlme_rx_enable_request(bool DeferPermit,UINT_32 RxOnTime,UINT_32 RxOnDuration,bool frUpper = false,PHYenum status = p_SUCCESS);
00587     void mlme_scan_request(UINT_8 ScanType,UINT_32 ScanChannels,UINT_8 ScanDuration,bool frUpper = false,PHYenum status = p_SUCCESS);
00588     void mlme_start_request(UINT_16 PANId,UINT_8 LogicalChannel,UINT_8 BeaconOrder,
00589                 UINT_8 SuperframeOrder,bool PANCoordinator,bool BatteryLifeExtension,
00590                 bool CoordRealignment,bool SecurityEnable,
00591                 bool frUpper = false,PHYenum status = p_SUCCESS);
00592     void mlme_sync_request(UINT_8 LogicalChannel, bool TrackBeacon,bool frUpper = false,PHYenum status = p_SUCCESS);
00593     void mlme_poll_request(UINT_8 CoordAddrMode,UINT_16 CoordPANId,IE3ADDR CoordAddress,bool SecurityEnable,
00594                    bool autoRequest = false,bool firstTime = false,PHYenum status = p_SUCCESS);
00595 
00596     void csmacaBegin(char pktType);
00597     void csmacaResume(void);
00598     void csmacaCallBack(PHYenum status);
00599     int getBattLifeExtSlotNum(void);
00600     double getCAP(bool small);
00601     double getCAPbyType(int type);
00602     bool canProceedWOcsmaca(Packet *p); //can we proceed w/o CSMA-CA?
00603     void transmitCmdData(void);
00604     void reset_TRX(const char *frFile,const char *frFunc,int line);
00605     void taskSuccess(char task,bool csmacaRes = true);
00606     void taskFailed(char task,MACenum status,bool csmacaRes = true);
00607     void freePkt(Packet *pkt);
00608     UINT_8 macHeaderLen(UINT_16 FrmCtrl);
00609     void constructACK(Packet *p);
00610     void constructMPDU(UINT_8 msduLength,Packet *msdu, UINT_16 FrmCtrl,UINT_8 BDSN,panAddrInfo DstAddrInfo,
00611                 panAddrInfo SrcAddrInfo,UINT_16 SuperSpec,UINT_8 CmdType,UINT_16 FCS);
00612     void constructCommandHeader(Packet *p,FrameCtrl *frmCtrl,UINT_8 CmdType,
00613                    UINT_8 dstAddrMode,UINT_16 dstPANId,IE3ADDR dstAddr,
00614                    UINT_8 srcAddrMode,UINT_16 srcPANId,IE3ADDR srcAddr,
00615                    bool secuEnable,bool pending,bool ackreq);
00616     void log(Packet *p);
00617     void resetCounter(int dst);
00618     int command(int argc, const char*const* argv);
00619     void changeNodeColor(double atTime,const char *newColor,bool save = true);
00620     void txBcnCmdDataHandler(void);
00621     void IFSHandler(void);
00622     void backoffBoundHandler(void);
00623 
00624 public:
00625     static bool verbose;
00626     static UINT_8 txOption;     //0x02=GTS; 0x04=Indirect; 0x00=Direct (only for 802.15.4-unaware upper layer app. packet)
00627     static bool ack4data;
00628     static UINT_8 callBack;     //0=no call back; 1=call back for failures; 2=call back for failures and successes
00629     static UINT_32 DBG_UID;
00630 
00631 protected:
00632 
00633     taskPending taskP;
00634     MAC_PIB mpib;
00635     PHY_PIB tmp_ppib;
00636     DevCapability capability;       //device capability (refer to Figure 49)
00637 
00638     //--- for beacon ---
00639     //(most are temp. variables which should be populated before being used)
00640     bool secuBeacon;
00641     SuperframeSpec sfSpec,sfSpec2,sfSpec3;  //superframe specification
00642     GTSSpec gtsSpec,gtsSpec2;       //GTS specification
00643     PendAddrSpec pendAddrSpec;      //pending address specification
00644     UINT_8 beaconPeriods,beaconPeriods2;    //# of backoff periods it takes to transmit the beacon
00645     PAN_ELE panDes,panDes2;         //PAN descriptor
00646     Packet *rxBeacon;           //the beacon packet just received
00647     double  macBcnTxTime;           //the time last beacon sent (in symbol) (we use this double variable instead of integer mpib.macBeaconTxTime for accuracy reason)
00648     double  macBcnRxTime;           //the time last beacon received from within PAN (in symbol)
00649     double  macBcnOtherRxTime;      //the time last beacon received from outside PAN (in symbol)
00650     //To support beacon enabled mode in multi-hop envirionment, we use {<mpib.macBeaconOrder>,<mpib.macSuperframeOrder>}
00651     //for coordinators (transmitting beacons) and the following two parameters for devices (receiving beacons). Note that,
00652     //in such an environment, a node can act as a coordinator and a device at the same time. More complicated algorithm 
00653     //is required for slotted CSMA-CA in this case.
00654     //(does 802.15.4 have this in mind?) 
00655     UINT_8  macBeaconOrder2;
00656     UINT_8  macSuperframeOrder2;
00657     UINT_8  macBeaconOrder3;
00658     UINT_8  macSuperframeOrder3;
00659     bool    oneMoreBeacon;          
00660     UINT_8  numLostBeacons;         //# of beacons lost in a row
00661     //------------------
00662     UINT_16 rt_myNodeID;            
00663 
00664     UINT_8 energyLevel;         
00665 
00666     //for association and transaction
00667     DEVICELINK *deviceLink1;
00668     DEVICELINK *deviceLink2;
00669     TRANSACLINK *transacLink1;
00670     TRANSACLINK *transacLink2;
00671 
00672 private:
00673     IE3ADDR aExtendedAddress;
00674 
00675     //timers
00676     macTxOverTimer *txOverT;
00677     macTxTimer *txT;
00678     macExtractTimer *extractT;
00679     macAssoRspWaitTimer *assoRspWaitT;
00680     macDataWaitTimer *dataWaitT;
00681     macRxEnableTimer *rxEnableT;
00682     macScanTimer *scanT;
00683     macBeaconTxTimer *bcnTxT;       //beacon transmission timer
00684     macBeaconRxTimer *bcnRxT;       //beacon reception timer
00685     macBeaconSearchTimer *bcnSearchT;   //beacon search timer
00686 
00687     //handlers
00688     Mac802_15_4Handler txCmdDataH;
00689     Mac802_15_4Handler IFSH;
00690     Mac802_15_4Handler backoffBoundH;
00691 
00692     bool isPANCoor;         //is a PAN coordinator?
00693     Phy802_15_4 *phy;
00694     CsmaCA802_15_4 *csmaca;
00695     SSCS802_15_4 *sscs;
00696     Nam802_15_4 *nam;
00697     PHYenum trx_state_req;      //tranceiver state required: TRX_OFF/TX_ON/RX_ON
00698     bool inTransmission;        //in the middle of transmission
00699     bool beaconWaiting;     //it's about time to transmit beacon (suppress all other transmissions)
00700     Packet *txBeacon;       //beacon packet to be transmitted (w/o using CSMA-CA)
00701     Packet *txAck;          //ack. packet to be transmitted (no waiting)
00702     Packet *txBcnCmd;       //beacon or command packet waiting for transmission (using CSMA-CA) -- triggered by receiving a packet
00703     Packet *txBcnCmd2;      //beacon or command packet waiting for transmission (using CSMA-CA) -- triggered by upper layer
00704     Packet *txData;         //data packet waiting for transmission (using CSMA-CA)
00705     Packet *txCsmaca;       //for which packet (txBcnCmd/txBcnCmd2/txData) is CSMA-CA performed
00706     Packet *txPkt;          //packet (any type) currently being transmitted
00707     Packet *rxData;         //data packet received (waiting for passing up)
00708     Packet *rxCmd;          //command packet received (will be handled after the transmission of ack.)
00709     UINT_32 txPkt_uid;      //for debug purpose
00710     double rxDataTime;      //the time when data packet received by MAC
00711     bool waitBcnCmdAck;     //only used if (txBcnCmd): waiting for an ack. or not
00712     bool waitBcnCmdAck2;        //only used if (txBcnCmd2): waiting for an ack. or not
00713     bool waitDataAck;       //only used if (txData): waiting for an ack. or not
00714     UINT_8 backoffStatus;       //0=no backoff yet;1=backoff successful;2=backoff failed;99=in the middle of backoff
00715     UINT_8 numDataRetry;        //# of retries (retransmissions) for data packet
00716     UINT_8 numBcnCmdRetry;      //# of retries (retransmissions) for beacon or command packet
00717     UINT_8 numBcnCmdRetry2;     //# of retries (retransmissions) for beacon or command packet
00718 
00719     NsObject *logtarget_;
00720 
00721     //packet duplication detection
00722     HLISTLINK *hlistBLink1;
00723     HLISTLINK *hlistBLink2;
00724     HLISTLINK *hlistDLink1;
00725     HLISTLINK *hlistDLink2;
00726 };
00727 
00728 #define plme_set_trx_state_request(state) \
00729 set_trx_state_request(state,__FILE__,__FUNCTION__,__LINE__)
00730 #define resetTRX() \
00731 reset_TRX(__FILE__,__FUNCTION__,__LINE__)
00732 
00733 #endif
00734 
00735 // End of file: p802_15_4mac.h

Generated on Tue Mar 6 16:47:48 2007 for ns2 Network Simulator 2.29 by  doxygen 1.4.6