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
1.4.6