p802_15_4field.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_4field.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_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 Mar 6 16:47:48 2007 for ns2 Network Simulator 2.29 by  doxygen 1.4.6