p802_15_4field.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:13k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /********************************************/
  2. /*     NS2 Simulator for IEEE 802.15.4      */
  3. /*           (per P802.15.4/D18)            */
  4. /*------------------------------------------*/
  5. /* by:        Jianliang Zheng               */
  6. /*        (zheng@ee.ccny.cuny.edu)          */
  7. /*              Myung J. Lee                */
  8. /*          (lee@ccny.cuny.edu)             */
  9. /*        ~~~~~~~~~~~~~~~~~~~~~~~~~         */
  10. /*           SAIT-CUNY Joint Lab            */
  11. /********************************************/
  12. // File:  p802_15_4field.h
  13. // Mode:  C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t
  14. // $Header: /cvsroot/nsnam/ns-2/wpan/p802_15_4field.h,v 1.1 2005/01/24 18:34:24 haldar Exp $
  15. /*
  16.  * Copyright (c) 2003-2004 Samsung Advanced Institute of Technology and
  17.  * The City University of New York. All rights reserved.
  18.  *
  19.  * Redistribution and use in source and binary forms, with or without
  20.  * modification, are permitted provided that the following conditions
  21.  * are met:
  22.  * 1. Redistributions of source code must retain the above copyright
  23.  *    notice, this list of conditions and the following disclaimer.
  24.  * 2. Redistributions in binary form must reproduce the above copyright
  25.  *    notice, this list of conditions and the following disclaimer in the
  26.  *    documentation and/or other materials provided with the distribution.
  27.  * 3. All advertising materials mentioning features or use of this software
  28.  *    must display the following acknowledgement:
  29.  * This product includes software developed by the Joint Lab of Samsung 
  30.  *      Advanced Institute of Technology and The City University of New York.
  31.  * 4. Neither the name of Samsung Advanced Institute of Technology nor of 
  32.  *    The City University of New York may be used to endorse or promote 
  33.  *    products derived from this software without specific prior written 
  34.  *    permission.
  35.  *
  36.  * THIS SOFTWARE IS PROVIDED BY THE JOINT LAB OF SAMSUNG ADVANCED INSTITUTE
  37.  * OF TECHNOLOGY AND THE CITY UNIVERSITY OF NEW YORK ``AS IS'' AND ANY EXPRESS 
  38.  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
  39.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN 
  40.  * NO EVENT SHALL SAMSUNG ADVANCED INSTITUTE OR THE CITY UNIVERSITY OF NEW YORK 
  41.  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
  42.  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 
  43.  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
  44.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
  45.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 
  46.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  47.  */
  48. #ifndef p802_15_4field_h
  49. #define p802_15_4field_h
  50. #include "p802_15_4def.h"
  51. /*
  52. #define STORELADDR(value,addr) ((*((unsigned char *)addr)) = ((*value) & 255 ,
  53.  (*((unsigned char *)addr+1)) = ((*value) >> 8) & 255 ,
  54.  (*((unsigned char *)addr+2)) = ((*value) >> 16) & 255 ,
  55.  (*((unsigned char *)addr+3)) = ((*value) >> 24) & 255 ,
  56.  (*((unsigned char *)addr+4)) = ((*value) >> 32) & 255 ,
  57.  (*((unsigned char *)addr+5)) = ((*value) >> 40) & 255 ,
  58.  (*((unsigned char *)addr+6)) = ((*value) >> 48) & 255 ,
  59.  (*((unsigned char *)addr+7)) = ((*value) >> 56) & 255))
  60. #define GETLADDR(addr)  ((*(unsigned char *)(addr)) |
  61. (*(((unsigned char *)(addr))+1) << 8) |
  62. (*(((unsigned char *)(addr))+2) << 16) |
  63. (*(((unsigned char *)(addr))+3) << 24) |
  64. (*(((unsigned char *)(addr))+4) << 32) |
  65. (*(((unsigned char *)(addr))+5) << 40) |
  66. (*(((unsigned char *)(addr))+6) << 48) |
  67. (*(((unsigned char *)(addr))+7) << 56))
  68. #define STORESADDR(value,addr) ((*((unsigned char *)addr)) = ((*value) & 255 ,
  69.  (*((unsigned char *)addr+1)) = ((*value) >> 8) & 255))
  70. #define GETSADDR(addr) ((*(unsigned char *)(addr)) |
  71. (*(((unsigned char *)(addr))+1) << 8))
  72. */
  73. //--MAC frame control field (leftmost bit numbered 0)---
  74. //types (3 bits) -- we reverse the bit order for convenient operation
  75. #define defFrmCtrl_Type_Beacon 0x00
  76. #define defFrmCtrl_Type_Data 0x04
  77. #define defFrmCtrl_Type_Ack 0x02
  78. #define defFrmCtrl_Type_MacCmd 0x06
  79. //dest/src addressing mode (2 bits) -- we reverse the bit order for convenient operation
  80. #define defFrmCtrl_AddrModeNone 0x00
  81. #define defFrmCtrl_AddrMode16 0x01
  82. #define defFrmCtrl_AddrMode64 0x03
  83. struct FrameCtrl
  84. {
  85. UINT_16 FrmCtrl; //(PSDU/MPDU) Frame Control (Figure 35)
  86. // --leftmost bit numbered 0 and transmitted first
  87. // --(012): Frame type (Table 65)
  88. //  --(210)=000: Beacon
  89. //  --(210)=001: Data
  90. //  --(210)=010: Ack.
  91. //  --(210)=011: MAC command
  92. //  --(210)=others: Reserved
  93. // --(3): Security enabled
  94. // --(4): Frame pending
  95. // --(5): Ack. req.
  96. // --(6): Intra PAN
  97. // --(789): Reserved
  98. // --(ab): Dest. addressing mode (Table 66)
  99. //  --(ba)=00: PAN ID and Addr. field not present
  100. //  --(ba)=01: Reserved
  101. //  --(ba)=10: 16-bit short address
  102. //  --(ba)=11: 64-bit extended address
  103. // --(cd): Reserved
  104. // --(ef): Source addressing mode (see Dest. addressing mode)
  105. UINT_8 frmType;
  106. bool secu;
  107. bool frmPending;
  108. bool ackReq;
  109. bool intraPan;
  110. UINT_8 dstAddrMode;
  111. UINT_8 srcAddrMode;
  112. void parse(void)
  113. {
  114. frmType = (FrmCtrl & 0xe000) >> 13;
  115. secu = ((FrmCtrl & 0x1000) == 0)?false:true;
  116. frmPending = ((FrmCtrl & 0x0800) == 0)?false:true;
  117. ackReq = ((FrmCtrl & 0x0400) == 0)?false:true;
  118. intraPan = ((FrmCtrl & 0x0200) == 0)?false:true;
  119. dstAddrMode = (FrmCtrl & 0x0030) >> 4;
  120. srcAddrMode = (FrmCtrl & 0x0003);
  121. }
  122. void setFrmType(UINT_8 frmtype)
  123. {
  124. frmType = frmtype;
  125. FrmCtrl = (FrmCtrl & 0x1fff) + (frmtype << 13);
  126. }
  127. void setSecu(bool sc)
  128. {
  129. secu = sc;
  130. FrmCtrl = (FrmCtrl & 0xefff);
  131. if (sc) FrmCtrl += 0x1000;
  132. }
  133. void setFrmPending(bool pending)
  134. {
  135. frmPending = pending;
  136. FrmCtrl = (FrmCtrl & 0xf7ff);
  137. if (pending) FrmCtrl += 0x0800;
  138. }
  139. void setAckReq(bool ack)
  140. {
  141. ackReq = ack;
  142. FrmCtrl = (FrmCtrl & 0xfbff);
  143. if (ack) FrmCtrl += 0x0400;
  144. }
  145. void setIntraPan(bool intrapan)
  146. {
  147. intraPan = intrapan;
  148. FrmCtrl = (FrmCtrl & 0xfdff);
  149. if (intrapan) FrmCtrl += 0x0200;
  150. }
  151. void setDstAddrMode(UINT_8 dstmode)
  152. {
  153. dstAddrMode = dstmode;
  154. FrmCtrl = (FrmCtrl & 0xffcf) + (dstmode << 4);
  155. }
  156. void setSrcAddrMode(UINT_8 srcmode)
  157. {
  158. srcAddrMode = srcmode;
  159. FrmCtrl = (FrmCtrl & 0xfffc) + srcmode;
  160. }
  161. };
  162. struct SuperframeSpec //refer to Figures 40,59
  163. {
  164. UINT_16 SuperSpec; //(MSDU) Superframe Specification (Figure 40)
  165. // --(0123): Beacon order
  166. // --(4567): Superframe order
  167. // --(89ab): Final CAP slot
  168. // --(c): Battery life extension
  169. // --(d): Reserved
  170. // --(e): PAN Coordinator
  171. // --(f): Association permit
  172. UINT_8 BO;
  173. UINT_32 BI;
  174. UINT_8 SO;
  175. UINT_32 SD;
  176. UINT_32 sd;
  177. UINT_8 FinCAP;
  178. bool BLE;
  179. bool PANCoor;
  180. bool AssoPmt;
  181. void parse(void)
  182. {
  183. BO = (SuperSpec & 0xf000) >> 12;
  184. BI = aBaseSuperframeDuration * (1 << BO);
  185. SO = (SuperSpec & 0x0f00) >> 8;
  186. SD = aBaseSuperframeDuration * (1 << SO); //superframe duration
  187. sd = aBaseSlotDuration * (1 << SO); //slot duration
  188. FinCAP = (SuperSpec & 0x00f0) >> 4;
  189. BLE = ((SuperSpec & 0x0008) == 0)?false:true;
  190. PANCoor = ((SuperSpec & 0x0002) == 0)?false:true;
  191. AssoPmt = ((SuperSpec & 0x0001) == 0)?false:true;
  192. }
  193. void setBO(UINT_8 bo)
  194. {
  195. BO = bo;
  196. BI = aBaseSuperframeDuration * (1 << BO);
  197. SuperSpec = (SuperSpec & 0x0fff) + (bo << 12);
  198. }
  199. void setSO(UINT_8 so)
  200. {
  201. SO = so;
  202. SD = aBaseSuperframeDuration * (1 << SO);
  203. sd = aBaseSlotDuration * (1 << SO);
  204. SuperSpec = (SuperSpec & 0xf0ff) + (so << 8);
  205. }
  206. void setFinCAP(UINT_8 fincap)
  207. {
  208. FinCAP = fincap;
  209. SuperSpec = (SuperSpec & 0xff0f) + (fincap << 4);
  210. }
  211. void setBLE(bool ble)
  212. {
  213. BLE = ble;
  214. SuperSpec = (SuperSpec & 0xfff7);
  215. if (ble) SuperSpec += 8;
  216. }
  217. void setPANCoor(bool pancoor)
  218. {
  219. PANCoor = pancoor;
  220. SuperSpec = (SuperSpec & 0xfffd);
  221. if (pancoor) SuperSpec += 2;
  222. }
  223. void setAssoPmt(bool assopmt)
  224. {
  225. AssoPmt = assopmt;
  226. SuperSpec = (SuperSpec & 0xfffe);
  227. if (assopmt) SuperSpec += 1;
  228. }
  229. };
  230. struct GTSDescriptor
  231. {
  232. UINT_16 devAddr16;
  233. UINT_8 slotSpec; // --(0123): GTS starting slot
  234. // --(4567): GTS length
  235. };
  236. struct GTSFields
  237. {
  238. UINT_8 spec; //GTS specification
  239. // --(012): GTS descriptor count
  240. // --(3456): reserved
  241. // --(7): GTS permit
  242. UINT_8 dir; //GTS directions
  243. // --(0123456): for up to 7 descriptors:
  244. // 1 = receive only (w.r.t. data transmission by the device)
  245. // 0 = transmit only (w.r.t. data transmission by the device)
  246. // --(7): reserved
  247. GTSDescriptor list[7]; //GTS descriptor list
  248. };
  249. struct GTSSpec
  250. {
  251. GTSFields fields;
  252. UINT_8 count; //GTS descriptor count
  253. bool permit; //GTS permit
  254. bool recvOnly[7]; //reception only
  255. UINT_8 slotStart[7]; //starting slot
  256. UINT_8 length[7]; //length in slots
  257. void parse(void)
  258. {
  259. int i;
  260. count = (fields.spec & 0xe0) >> 5;
  261. permit = ((fields.spec & 0x01) != 0)?true:false;
  262. for (i=0;i<count;i++)
  263. {
  264. recvOnly[i] = ((fields.dir & (1<<(7-i))) != 0);
  265. slotStart[i] = (fields.list[i].slotSpec & 0xf0) >> 4;
  266. length[i] = (fields.list[i].slotSpec & 0x0f);
  267. }
  268. }
  269. void setCount(UINT_8 cnt)
  270. {
  271. count = cnt;
  272. fields.spec = (fields.spec & 0x1f) + (cnt << 5);
  273. }
  274. void setPermit(bool pmt)
  275. {
  276. permit = pmt;
  277. fields.spec = (fields.spec & 0xfe);
  278. if (pmt) fields.spec += 1;
  279. }
  280. void setRecvOnly(UINT_8 ith,bool rvonly)
  281. {
  282. recvOnly[ith] = rvonly;
  283. fields.dir = fields.dir & ((1<<(7-ith))^0xff);
  284. if (rvonly) fields.dir += (1<<(7-ith));
  285. }
  286. void setSlotStart(UINT_8 ith,UINT_8 st)
  287. {
  288. slotStart[ith] = st;
  289. slotStart[ith] = (fields.list[ith].slotSpec & 0x0f) + (st << 4);
  290. }
  291. void setLength(UINT_8 ith,UINT_8 len)
  292. {
  293. length[ith] = len;
  294. length[ith] = (fields.list[ith].slotSpec & 0xf0) + len;
  295. }
  296. int size(void)
  297. {
  298. count = (fields.spec & 0xe0) >> 5;
  299. return (1 + 1 + 3 * count);
  300. }
  301. };
  302. struct PendAddrFields
  303. {
  304. UINT_8 spec; //Pending address specification field (refer to Figure 44)
  305. // --(012): num of short addresses pending
  306. // --(3): reserved
  307. // --(456): num of extended addresses pending
  308. // --(7): reserved
  309. IE3ADDR addrList[7]; //pending address list (shared by short/extended addresses)
  310. };
  311. struct PendAddrSpec
  312. {
  313. PendAddrFields fields;
  314. UINT_8 numShortAddr; //num of short addresses pending
  315. UINT_8 numExtendedAddr; //num of extended addresses pending
  316. //for constructing the fields
  317. UINT_8 addShortAddr(UINT_16 sa)
  318. {
  319. int i;
  320. if (numShortAddr + numExtendedAddr >= 7)
  321. return (numShortAddr + numExtendedAddr);
  322. //only unique address added
  323. for (i=0;i<numShortAddr;i++)
  324. if (fields.addrList[i] == sa)
  325. return (numShortAddr + numExtendedAddr);
  326. fields.addrList[numShortAddr] = sa;
  327. numShortAddr++;
  328. return (numShortAddr + numExtendedAddr);
  329. }
  330. UINT_8 addExtendedAddr(IE3ADDR ea)
  331. {
  332. int i;
  333. if (numShortAddr + numExtendedAddr >= 7)
  334. return (numShortAddr + numExtendedAddr);
  335. //only unique address added
  336. for (i=6;i>6-numExtendedAddr;i--)
  337. if (fields.addrList[i] == ea)
  338. return (numShortAddr + numExtendedAddr);
  339. //save the extended address in reverse order
  340. fields.addrList[6-numExtendedAddr] = ea;
  341. numExtendedAddr++;
  342. return (numShortAddr + numExtendedAddr);
  343. }
  344. void format(void)
  345. {
  346. //realign the addresses
  347. int i;
  348. IE3ADDR tmpAddr;
  349. //restore the order of extended addresses
  350. for (i=0;i<numExtendedAddr;i++)
  351. {
  352. if ((7 - numExtendedAddr + i) < (6 - i))
  353. {
  354. tmpAddr = fields.addrList[7 - numExtendedAddr + i];
  355. fields.addrList[7 - numExtendedAddr + i] = fields.addrList[6 - i];
  356. fields.addrList[6 - i] = tmpAddr;
  357. }
  358. }
  359. //attach the extended addresses to short addresses
  360. for (i=0;i<numExtendedAddr;i++)
  361. fields.addrList[numShortAddr + i] = fields.addrList[7 - numExtendedAddr + i];
  362. //update address specification
  363. fields.spec = ((numShortAddr) << 5) + (numExtendedAddr << 1);
  364. }
  365. //for parsing the received fields
  366. void parse(void)
  367. {
  368. numShortAddr = (fields.spec & 0xe0) >> 5;
  369. numExtendedAddr = (fields.spec & 0x0e) >> 1;
  370. }
  371. int size(void)
  372. {
  373. parse();
  374. return (1 + numShortAddr * 2 + numExtendedAddr * 8);
  375. }
  376. };
  377. struct DevCapability
  378. {
  379. UINT_8 cap; //refer to Figure 49
  380. // --(0): alternate PAN coordinator
  381. // --(1): device type (1=FFD,0=RFD)
  382. // --(2): power source (1=mains powered,0=non mains powered)
  383. // --(3): receiver on when idle
  384. // --(45): reserved
  385. // --(6): security capability
  386. // --(7): allocate address (asking for allocation of a short address during association)
  387. bool alterPANCoor;
  388. bool FFD;
  389. bool mainsPower;
  390. bool recvOnWhenIdle;
  391. bool secuCapable;
  392. bool alloShortAddr;
  393. void parse(void)
  394. {
  395. alterPANCoor = ((cap & 0x80) != 0)?true:false;
  396. FFD = ((cap & 0x40) != 0)?true:false;
  397. mainsPower = ((cap & 0x20) != 0)?true:false;
  398. recvOnWhenIdle = ((cap & 0x10) != 0)?true:false;
  399. secuCapable = ((cap & 0x02) != 0)?true:false;
  400. alloShortAddr = ((cap & 0x01) != 0)?true:false;
  401. }
  402. void setAlterPANCoor(bool alterPC)
  403. {
  404. alterPANCoor = alterPC;
  405. cap = (cap & 0x7f);
  406. if (alterPC) cap += 0x80;
  407. }
  408. void setFFD(bool ffd)
  409. {
  410. FFD = ffd;
  411. cap = (cap & 0xbf);
  412. if (ffd) cap += 0x40;
  413. }
  414. void setMainPower(bool mp)
  415. {
  416. mainsPower = mp;
  417. cap = (cap & 0xdf);
  418. if (mp) cap += 0x20;
  419. }
  420. void setRecvOnWhenIdle(bool onidle)
  421. {
  422. recvOnWhenIdle = onidle;
  423. cap = (cap & 0xef);
  424. if (onidle) cap += 0x10;
  425. }
  426. void setSecuCapable(bool sc)
  427. {
  428. secuCapable = sc;
  429. cap = (cap & 0xfd);
  430. if (sc) cap += 0x02;
  431. }
  432. void setAlloShortAddr(bool alloc)
  433. {
  434. alloShortAddr = alloc;
  435. cap = (cap & 0xfe);
  436. if (alloc) cap += 0x01;
  437. }
  438. };
  439. #endif
  440. // End of file: p802_15_4field.h