• Main Page
  • Classes
  • Files
  • File List

/Users/yzchen/ns/ns-allinone-2.33/ns-2.33/wpan/p802_15_4field.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_4field.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_4field.h,v 1.1 2005/01/24 18:34:24 haldar 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_4field_h
00054 #define p802_15_4field_h
00055 
00056 #include "p802_15_4def.h"
00057 
00058 /*
00059 #define STORELADDR(value,addr)  ((*((unsigned char *)addr)) = ((*value) & 255 ,\
00060                                  (*((unsigned char *)addr+1)) = ((*value) >> 8) & 255 ,\
00061                                  (*((unsigned char *)addr+2)) = ((*value) >> 16) & 255 ,\
00062                                  (*((unsigned char *)addr+3)) = ((*value) >> 24) & 255 ,\
00063                                  (*((unsigned char *)addr+4)) = ((*value) >> 32) & 255 ,\
00064                                  (*((unsigned char *)addr+5)) = ((*value) >> 40) & 255 ,\
00065                                  (*((unsigned char *)addr+6)) = ((*value) >> 48) & 255 ,\
00066                                  (*((unsigned char *)addr+7)) = ((*value) >> 56) & 255))
00067 #define GETLADDR(addr)           ((*(unsigned char *)(addr)) |\
00068                                 (*(((unsigned char *)(addr))+1) << 8) |\
00069                                 (*(((unsigned char *)(addr))+2) << 16) |\
00070                                 (*(((unsigned char *)(addr))+3) << 24) |\
00071                                 (*(((unsigned char *)(addr))+4) << 32) |\
00072                                 (*(((unsigned char *)(addr))+5) << 40) |\
00073                                 (*(((unsigned char *)(addr))+6) << 48) |\
00074                                 (*(((unsigned char *)(addr))+7) << 56))
00075 
00076 #define STORESADDR(value,addr)  ((*((unsigned char *)addr)) = ((*value) & 255 ,\
00077                                  (*((unsigned char *)addr+1)) = ((*value) >> 8) & 255))
00078 
00079 #define GETSADDR(addr)          ((*(unsigned char *)(addr)) |\
00080                                 (*(((unsigned char *)(addr))+1) << 8))
00081 */      
00082 
00083 //--MAC frame control field (leftmost bit numbered 0)---
00084 //types (3 bits) -- we reverse the bit order for convenient operation
00085 #define defFrmCtrl_Type_Beacon          0x00
00086 #define defFrmCtrl_Type_Data            0x04
00087 #define defFrmCtrl_Type_Ack             0x02
00088 #define defFrmCtrl_Type_MacCmd          0x06
00089 //dest/src addressing mode (2 bits) -- we reverse the bit order for convenient operation
00090 #define defFrmCtrl_AddrModeNone         0x00
00091 #define defFrmCtrl_AddrMode16           0x01
00092 #define defFrmCtrl_AddrMode64           0x03
00093 
00094 struct FrameCtrl
00095 {
00096         UINT_16 FrmCtrl;                //(PSDU/MPDU) Frame Control (Figure 35)
00097                                         // --leftmost bit numbered 0 and transmitted first
00098                                         // --(012):     Frame type (Table 65)
00099                                         //               --(210)=000:           Beacon
00100                                         //               --(210)=001:           Data
00101                                         //               --(210)=010:           Ack.
00102                                         //               --(210)=011:           MAC command
00103                                         //               --(210)=others:        Reserved
00104                                         // --(3):       Security enabled
00105                                         // --(4):       Frame pending
00106                                         // --(5):       Ack. req.
00107                                         // --(6):       Intra PAN
00108                                         // --(789):     Reserved
00109                                         // --(ab):      Dest. addressing mode (Table 66)
00110                                         //               --(ba)=00:     PAN ID and Addr. field not present
00111                                         //               --(ba)=01:     Reserved
00112                                         //               --(ba)=10:     16-bit short address
00113                                         //               --(ba)=11:     64-bit extended address
00114                                         // --(cd):      Reserved
00115                                         // --(ef):      Source addressing mode (see Dest. addressing mode)
00116         UINT_8 frmType;
00117         bool secu;
00118         bool frmPending;
00119         bool ackReq;
00120         bool intraPan;
00121         UINT_8 dstAddrMode;
00122         UINT_8 srcAddrMode;
00123         
00124         void parse(void)
00125         {
00126                 frmType = (FrmCtrl & 0xe000) >> 13;
00127                 secu = ((FrmCtrl & 0x1000) == 0)?false:true;
00128                 frmPending = ((FrmCtrl & 0x0800) == 0)?false:true;
00129                 ackReq = ((FrmCtrl & 0x0400) == 0)?false:true;
00130                 intraPan = ((FrmCtrl & 0x0200) == 0)?false:true;
00131                 dstAddrMode = (FrmCtrl & 0x0030) >> 4;
00132                 srcAddrMode = (FrmCtrl & 0x0003);
00133         }
00134 
00135         void setFrmType(UINT_8 frmtype)
00136         {
00137                 frmType = frmtype;
00138                 FrmCtrl = (FrmCtrl & 0x1fff) + (frmtype << 13);
00139         }
00140         void setSecu(bool sc)
00141         {
00142                 secu = sc;
00143                 FrmCtrl = (FrmCtrl & 0xefff);
00144                 if (sc) FrmCtrl += 0x1000;
00145         }
00146         void setFrmPending(bool pending)
00147         {
00148                 frmPending = pending;
00149                 FrmCtrl = (FrmCtrl & 0xf7ff);
00150                 if (pending) FrmCtrl += 0x0800;
00151         }
00152         void setAckReq(bool ack)
00153         {
00154                 ackReq = ack;
00155                 FrmCtrl = (FrmCtrl & 0xfbff);
00156                 if (ack) FrmCtrl += 0x0400;
00157         }
00158         void setIntraPan(bool intrapan)
00159         {
00160                 intraPan = intrapan;
00161                 FrmCtrl = (FrmCtrl & 0xfdff);
00162                 if (intrapan) FrmCtrl += 0x0200;
00163         }
00164         void setDstAddrMode(UINT_8 dstmode)
00165         {
00166                 dstAddrMode = dstmode;
00167                 FrmCtrl = (FrmCtrl & 0xffcf) + (dstmode << 4);
00168         }
00169         void setSrcAddrMode(UINT_8 srcmode)
00170         {
00171                 srcAddrMode = srcmode;
00172                 FrmCtrl = (FrmCtrl & 0xfffc) + srcmode;
00173         }
00174 };
00175 
00176 struct SuperframeSpec                   //refer to Figures 40,59
00177 {
00178         UINT_16 SuperSpec;              //(MSDU) Superframe Specification (Figure 40)
00179                                         // --(0123):    Beacon order
00180                                         // --(4567):    Superframe order
00181                                         // --(89ab):    Final CAP slot
00182                                         // --(c):       Battery life extension
00183                                         // --(d):       Reserved
00184                                         // --(e):       PAN Coordinator
00185                                         // --(f):       Association permit
00186         UINT_8 BO;
00187         UINT_32 BI;
00188         UINT_8 SO;
00189         UINT_32 SD;
00190         UINT_32 sd;
00191         UINT_8 FinCAP;
00192         bool BLE;
00193         bool PANCoor;
00194         bool AssoPmt;
00195 
00196         void parse(void)
00197         {
00198                 BO = (SuperSpec & 0xf000) >> 12;
00199                 BI = aBaseSuperframeDuration * (1 << BO);
00200                 SO = (SuperSpec & 0x0f00) >> 8;
00201                 SD = aBaseSuperframeDuration * (1 << SO);       //superframe duration
00202                 sd = aBaseSlotDuration * (1 << SO);             //slot duration
00203                 FinCAP = (SuperSpec & 0x00f0) >> 4;
00204                 BLE = ((SuperSpec & 0x0008) == 0)?false:true;
00205                 PANCoor = ((SuperSpec & 0x0002) == 0)?false:true;
00206                 AssoPmt = ((SuperSpec & 0x0001) == 0)?false:true;
00207         }
00208 
00209         void setBO(UINT_8 bo)
00210         {
00211                 BO = bo;
00212                 BI = aBaseSuperframeDuration * (1 << BO);
00213                 SuperSpec = (SuperSpec & 0x0fff) + (bo << 12);
00214         }
00215         void setSO(UINT_8 so)
00216         {
00217                 SO = so;
00218                 SD = aBaseSuperframeDuration * (1 << SO);
00219                 sd = aBaseSlotDuration * (1 << SO);
00220                 SuperSpec = (SuperSpec & 0xf0ff) + (so << 8);
00221         }
00222         void setFinCAP(UINT_8 fincap)
00223         {
00224                 FinCAP = fincap;
00225                 SuperSpec = (SuperSpec & 0xff0f) + (fincap << 4);
00226         }
00227         void setBLE(bool ble)
00228         {
00229                 BLE = ble;
00230                 SuperSpec = (SuperSpec & 0xfff7);
00231                 if (ble) SuperSpec += 8;
00232         }
00233         void setPANCoor(bool pancoor)
00234         {
00235                 PANCoor = pancoor;
00236                 SuperSpec = (SuperSpec & 0xfffd);
00237                 if (pancoor) SuperSpec += 2;
00238         }
00239         void setAssoPmt(bool assopmt)
00240         {
00241                 AssoPmt = assopmt;
00242                 SuperSpec = (SuperSpec & 0xfffe);
00243                 if (assopmt) SuperSpec += 1;
00244         }
00245         
00246 };
00247 
00248 struct GTSDescriptor
00249 {
00250         UINT_16 devAddr16;
00251         UINT_8 slotSpec;        // --(0123):    GTS starting slot
00252                                 // --(4567):    GTS length
00253 };
00254 
00255 struct GTSFields
00256 {
00257         UINT_8 spec;            //GTS specification
00258                                 // --(012):     GTS descriptor count
00259                                 // --(3456):    reserved
00260                                 // --(7):       GTS permit
00261         UINT_8 dir;             //GTS directions
00262                                 // --(0123456): for up to 7 descriptors:
00263                                 //              1 = receive only (w.r.t. data transmission by the device)
00264                                 //              0 = transmit only (w.r.t. data transmission by the device)
00265                                 // --(7):       reserved
00266         GTSDescriptor list[7];  //GTS descriptor list
00267 };
00268 
00269 struct GTSSpec
00270 {
00271         GTSFields fields;
00272 
00273         UINT_8 count;           //GTS descriptor count
00274         bool permit;            //GTS permit
00275         bool recvOnly[7];       //reception only
00276         UINT_8 slotStart[7];    //starting slot
00277         UINT_8 length[7];       //length in slots
00278 
00279         void parse(void)
00280         {
00281                 int i;
00282                 count = (fields.spec & 0xe0) >> 5;
00283                 permit = ((fields.spec & 0x01) != 0)?true:false;
00284                 for (i=0;i<count;i++)
00285                 {
00286                         recvOnly[i] = ((fields.dir & (1<<(7-i))) != 0);
00287                         slotStart[i] = (fields.list[i].slotSpec & 0xf0) >> 4;
00288                         length[i] = (fields.list[i].slotSpec & 0x0f);
00289                 }
00290         }
00291 
00292         void setCount(UINT_8 cnt)
00293         {
00294                 count = cnt;
00295                 fields.spec = (fields.spec & 0x1f) + (cnt << 5);
00296         }
00297         void setPermit(bool pmt)
00298         {
00299                 permit = pmt;
00300                 fields.spec = (fields.spec & 0xfe);
00301                 if (pmt) fields.spec += 1;
00302         }
00303         void setRecvOnly(UINT_8 ith,bool rvonly)
00304         {
00305                 recvOnly[ith] = rvonly;
00306                 fields.dir = fields.dir & ((1<<(7-ith))^0xff);
00307                 if (rvonly) fields.dir += (1<<(7-ith));
00308         }
00309         void setSlotStart(UINT_8 ith,UINT_8 st)
00310         {
00311                 slotStart[ith] = st;
00312                 slotStart[ith] = (fields.list[ith].slotSpec & 0x0f) + (st << 4);
00313         }
00314         void setLength(UINT_8 ith,UINT_8 len)
00315         {
00316                 length[ith] = len;
00317                 length[ith] = (fields.list[ith].slotSpec & 0xf0) + len;
00318         }
00319         int size(void)
00320         {
00321                 count = (fields.spec & 0xe0) >> 5;
00322                 return (1 + 1 + 3 * count);
00323         }
00324 };
00325 
00326 struct PendAddrFields
00327 {
00328         UINT_8 spec;            //Pending address specification field (refer to Figure 44)
00329                                 // --(012):     num of short addresses pending
00330                                 // --(3):       reserved
00331                                 // --(456):     num of extended addresses pending
00332                                 // --(7):       reserved
00333         IE3ADDR addrList[7];    //pending address list (shared by short/extended addresses)
00334 };
00335 
00336 struct PendAddrSpec
00337 {
00338         PendAddrFields fields;
00339 
00340         UINT_8 numShortAddr;    //num of short addresses pending
00341         UINT_8 numExtendedAddr; //num of extended addresses pending
00342 
00343         //for constructing the fields
00344         UINT_8 addShortAddr(UINT_16 sa)
00345         {
00346                 int i;
00347 
00348                 if (numShortAddr + numExtendedAddr >= 7)
00349                         return (numShortAddr + numExtendedAddr);
00350                 //only unique address added
00351                 for (i=0;i<numShortAddr;i++)
00352                 if (fields.addrList[i] == sa)
00353                         return (numShortAddr + numExtendedAddr);
00354                 fields.addrList[numShortAddr] = sa;
00355                 numShortAddr++;
00356                 return (numShortAddr + numExtendedAddr);
00357         }
00358         UINT_8 addExtendedAddr(IE3ADDR ea)
00359         {
00360                 int i;
00361 
00362                 if (numShortAddr + numExtendedAddr >= 7)
00363                         return (numShortAddr + numExtendedAddr);
00364                 //only unique address added
00365                 for (i=6;i>6-numExtendedAddr;i--)
00366                 if (fields.addrList[i] == ea)
00367                         return (numShortAddr + numExtendedAddr);
00368                 //save the extended address in reverse order
00369                 fields.addrList[6-numExtendedAddr] = ea;
00370                 numExtendedAddr++;
00371                 return (numShortAddr + numExtendedAddr);
00372         }
00373         void format(void)
00374         {
00375                 //realign the addresses
00376                 int i;
00377                 IE3ADDR tmpAddr;
00378                 //restore the order of extended addresses
00379                 for (i=0;i<numExtendedAddr;i++)
00380                 {
00381                         if ((7 - numExtendedAddr + i) < (6 - i))
00382                         {
00383                                 tmpAddr = fields.addrList[7 - numExtendedAddr + i];
00384                                 fields.addrList[7 - numExtendedAddr + i] = fields.addrList[6 - i];
00385                                 fields.addrList[6 - i] = tmpAddr;
00386                         }
00387                 }
00388                 //attach the extended addresses to short addresses
00389                 for (i=0;i<numExtendedAddr;i++)
00390                         fields.addrList[numShortAddr + i] = fields.addrList[7 - numExtendedAddr + i];
00391                 //update address specification
00392                 fields.spec = ((numShortAddr) << 5) + (numExtendedAddr << 1);
00393         }
00394         //for parsing the received fields
00395         void parse(void)
00396         {
00397                 numShortAddr = (fields.spec & 0xe0) >> 5;
00398                 numExtendedAddr = (fields.spec & 0x0e) >> 1;
00399         }
00400 
00401         int size(void)
00402         {
00403                 parse();
00404                 return (1 + numShortAddr * 2 + numExtendedAddr * 8);
00405         }
00406 };
00407 
00408 struct DevCapability
00409 {
00410         UINT_8 cap;             //refer to Figure 49
00411                                 // --(0):       alternate PAN coordinator
00412                                 // --(1):       device type (1=FFD,0=RFD)
00413                                 // --(2):       power source (1=mains powered,0=non mains powered)
00414                                 // --(3):       receiver on when idle
00415                                 // --(45):      reserved
00416                                 // --(6):       security capability
00417                                 // --(7):       allocate address (asking for allocation of a short address during association)
00418 
00419         bool alterPANCoor;
00420         bool FFD;
00421         bool mainsPower;
00422         bool recvOnWhenIdle;
00423         bool secuCapable;
00424         bool alloShortAddr;
00425 
00426         void parse(void)
00427         {
00428                 alterPANCoor = ((cap & 0x80) != 0)?true:false;
00429                 FFD = ((cap & 0x40) != 0)?true:false;
00430                 mainsPower = ((cap & 0x20) != 0)?true:false;
00431                 recvOnWhenIdle = ((cap & 0x10) != 0)?true:false;
00432                 secuCapable = ((cap & 0x02) != 0)?true:false;
00433                 alloShortAddr = ((cap & 0x01) != 0)?true:false;
00434         }
00435 
00436         void setAlterPANCoor(bool alterPC)
00437         {
00438                 alterPANCoor = alterPC;
00439                 cap = (cap & 0x7f);
00440                 if (alterPC) cap += 0x80;
00441         }
00442         void setFFD(bool ffd)
00443         {
00444                 FFD = ffd;
00445                 cap = (cap & 0xbf);
00446                 if (ffd) cap += 0x40;
00447         }
00448         void setMainPower(bool mp)
00449         {
00450                 mainsPower = mp;
00451                 cap = (cap & 0xdf);
00452                 if (mp) cap += 0x20;
00453         }
00454         void setRecvOnWhenIdle(bool onidle)
00455         {
00456                 recvOnWhenIdle = onidle;
00457                 cap = (cap & 0xef);
00458                 if (onidle) cap += 0x10;
00459         }
00460         void setSecuCapable(bool sc)
00461         {
00462                 secuCapable = sc;
00463                 cap = (cap & 0xfd);
00464                 if (sc) cap += 0x02;
00465         }
00466         void setAlloShortAddr(bool alloc)
00467         {
00468                 alloShortAddr = alloc;
00469                 cap = (cap & 0xfe);
00470                 if (alloc) cap += 0x01;
00471         }
00472 };
00473 
00474 #endif
00475 
00476 // End of file: p802_15_4field.h

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