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

通讯编程

开发平台:

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_4transac.cc
  13. // Mode:  C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t
  14. // $Header: /cvsroot/nsnam/ns-2/wpan/p802_15_4transac.cc,v 1.2 2005/07/13 03:51:34 tomh 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. #include <scheduler.h>
  49. #include "p802_15_4transac.h"
  50. #include "p802_15_4pkt.h"
  51. int addDeviceLink(DEVICELINK **deviceLink1, DEVICELINK **deviceLink2, IE3ADDR addr, UINT_8 cap)
  52. {
  53. DEVICELINK *tmp;
  54. if(*deviceLink2 == NULL) //not exist yet
  55. {
  56. *deviceLink2 = new DEVICELINK(addr,cap);
  57. if (*deviceLink2 == NULL) return 1;
  58. *deviceLink1 = *deviceLink2;
  59. }
  60. else
  61. {
  62. tmp=new DEVICELINK(addr,cap);
  63. if (tmp == NULL) return 1;
  64. tmp->last = *deviceLink2;
  65. (*deviceLink2)->next = tmp;
  66. *deviceLink2 = tmp;
  67. }
  68. return 0;
  69. }
  70. int updateDeviceLink(int oper, DEVICELINK **deviceLink1, DEVICELINK **deviceLink2, IE3ADDR addr)
  71. {
  72. DEVICELINK *tmp;
  73. int rt;
  74. rt = 1;
  75. tmp = *deviceLink1;
  76. while(tmp != NULL)
  77. {
  78. if(tmp->addr64 == addr)
  79. {
  80. if (oper == tr_oper_del) //delete an element
  81. {
  82. if(tmp->last != NULL)
  83. {
  84. tmp->last->next = tmp->next;
  85. if(tmp->next != NULL)
  86. tmp->next->last = tmp->last;
  87. else
  88. *deviceLink2 = tmp->last;
  89. }
  90. else if (tmp->next != NULL)
  91. {
  92. *deviceLink1 = tmp->next;
  93. tmp->next->last = NULL;
  94. }
  95. else
  96. {
  97. *deviceLink1 = NULL;
  98. *deviceLink2 = NULL;
  99. }
  100. delete tmp;
  101. }
  102. rt = 0;
  103. break;
  104. }
  105. tmp = tmp->next;
  106. }
  107. return rt;
  108. }
  109. int numberDeviceLink(DEVICELINK **deviceLink1)
  110. {
  111. DEVICELINK *tmp;
  112. int num;
  113. num = 0;
  114. tmp = *deviceLink1;
  115. while(tmp != NULL)
  116. {
  117. num++;
  118. tmp = tmp->next;
  119. }
  120. return num;
  121. }
  122. int chkAddDeviceLink(DEVICELINK **deviceLink1, DEVICELINK **deviceLink2, IE3ADDR addr, UINT_8 cap)
  123. {
  124.         int i;
  125.         i = updateDeviceLink(tr_oper_est, deviceLink1, deviceLink2, addr);
  126.         if (i == 0) return 1;
  127.         i = addDeviceLink(deviceLink1, deviceLink2, addr, cap);
  128.         if (i == 0) return 0;
  129.         else return 2;
  130. }
  131. void emptyDeviceLink(DEVICELINK **deviceLink1, DEVICELINK **deviceLink2)
  132. {
  133. DEVICELINK *tmp, *tmp2;
  134. if(*deviceLink1 != NULL)
  135. {
  136. tmp = *deviceLink1;
  137. while(tmp != NULL)
  138. {
  139. tmp2 = tmp;
  140. tmp = tmp->next;
  141. delete tmp2;
  142. }
  143. *deviceLink1 = NULL;
  144. }
  145. *deviceLink2 = *deviceLink1;
  146. }
  147. void dumpDeviceLink(DEVICELINK *deviceLink1, IE3ADDR coorAddr)
  148. {
  149. DEVICELINK *tmp;
  150. int i;
  151. fprintf(stdout, "[%.2f] --- dump associated device list (by coordinator %d) ---n", Scheduler::instance().clock(), coorAddr);
  152. tmp = deviceLink1;
  153. i = 1;
  154. while(tmp != NULL)
  155. {
  156. fprintf(stdout, "t%d:taddress = 0x%xn", i,tmp->addr64);
  157. tmp = tmp->next;
  158. i++;
  159. }
  160. }
  161. //--------------------------------------------------------------------------------------
  162. void purgeTransacLink(TRANSACLINK **transacLink1, TRANSACLINK **transacLink2)
  163. {
  164. //purge expired transactions
  165. TRANSACLINK *tmp,*tmp2;
  166. tmp = *transacLink1;
  167. while(tmp != NULL)
  168. {
  169. if (CURRENT_TIME > tmp->expTime)
  170. {
  171. tmp2 = tmp;
  172. if (tmp->next != NULL)
  173. tmp = tmp->next->next;
  174. else
  175. tmp = NULL;
  176. //--- delete the transaction ---
  177. //don't try to call updateTransacLink() -- to avoid re-entries of functions
  178. if(tmp2->last != NULL)
  179. {
  180. tmp2->last->next = tmp2->next;
  181. if(tmp2->next != NULL)
  182. tmp2->next->last = tmp2->last;
  183. else
  184. *transacLink2 = tmp2->last;
  185. }
  186. else if (tmp2->next != NULL)
  187. {
  188. *transacLink1 = tmp2->next;
  189. tmp2->next->last = NULL;
  190. }
  191. else
  192. {
  193. *transacLink1 = NULL;
  194. *transacLink2 = NULL;
  195. }
  196. //free the packet first
  197. Packet::free(tmp2->pkt);
  198. delete tmp2;
  199. //--------------------------------
  200. }
  201. else
  202. tmp = tmp->next;
  203. }
  204. }
  205. int addTransacLink(TRANSACLINK **transacLink1, TRANSACLINK **transacLink2, UINT_8 pendAM, IE3ADDR pendAddr, Packet *p, UINT_8 msduH, double kpTime)
  206. {
  207. TRANSACLINK *tmp;
  208. if(*transacLink2 == NULL) //not exist yet
  209. {
  210. *transacLink2 = new TRANSACLINK(pendAM,pendAddr,p,msduH,kpTime);
  211. if (*transacLink2 == NULL) return 1;
  212. *transacLink1 = *transacLink2;
  213. }
  214. else
  215. {
  216. tmp=new TRANSACLINK(pendAM,pendAddr,p,msduH,kpTime);
  217. if (tmp == NULL) return 1;
  218. tmp->last = *transacLink2;
  219. (*transacLink2)->next = tmp;
  220. *transacLink2 = tmp;
  221. }
  222. return 0;
  223. }
  224. Packet *getPktFrTransacLink(TRANSACLINK **transacLink1, UINT_8 pendAM, IE3ADDR pendAddr)
  225. {
  226. TRANSACLINK *tmp;
  227. tmp = *transacLink1;
  228. while(tmp != NULL)
  229. {
  230. if((tmp->pendAddrMode == pendAM)
  231. && (((pendAM == defFrmCtrl_AddrMode16)&&((UINT_16)pendAddr == tmp->pendAddr16))
  232.  ||((pendAM == defFrmCtrl_AddrMode64)&&(pendAddr == tmp->pendAddr64))))
  233. {
  234. return tmp->pkt;
  235. }
  236. tmp = tmp->next;
  237. }
  238. return NULL;
  239. }
  240. int updateTransacLink(int oper, TRANSACLINK **transacLink1, TRANSACLINK **transacLink2, UINT_8 pendAM, IE3ADDR pendAddr)
  241. {
  242. TRANSACLINK *tmp;
  243. int rt;
  244. //purge first if (oper == tr_oper_est)
  245. if (oper == tr_oper_est)
  246. purgeTransacLink(transacLink1,transacLink2);
  247. rt = 1;
  248. tmp = *transacLink1;
  249. if (oper == tr_oper_EST)
  250. {
  251. while(tmp != NULL)
  252. {
  253. if((tmp->pendAddrMode == pendAM)
  254. && (((pendAM == defFrmCtrl_AddrMode16)&&((UINT_16)pendAddr == tmp->pendAddr16))
  255.   ||((pendAM == defFrmCtrl_AddrMode64)&&(pendAddr == tmp->pendAddr64))))
  256. {
  257. rt = 0;
  258. tmp = tmp->next;
  259. break;
  260. }
  261. tmp = tmp->next;
  262. }
  263. if (rt) return 1;
  264. }
  265. rt = 1;
  266. while(tmp != NULL)
  267. {
  268. if((tmp->pendAddrMode == pendAM)
  269. && (((pendAM == defFrmCtrl_AddrMode16)&&((UINT_16)pendAddr == tmp->pendAddr16))
  270.  ||((pendAM == defFrmCtrl_AddrMode64)&&(pendAddr == tmp->pendAddr64))))
  271. {
  272. if (oper == tr_oper_del) //delete an element
  273. {
  274. if(tmp->last != NULL)
  275. {
  276. tmp->last->next = tmp->next;
  277. if(tmp->next != NULL)
  278. tmp->next->last = tmp->last;
  279. else
  280. *transacLink2 = tmp->last;
  281. }
  282. else if (tmp->next != NULL)
  283. {
  284. *transacLink1 = tmp->next;
  285. tmp->next->last = NULL;
  286. }
  287. else
  288. {
  289. *transacLink1 = NULL;
  290. *transacLink2 = NULL;
  291. }
  292. //free the packet first
  293. Packet::free(tmp->pkt);
  294. delete tmp;
  295. }
  296. rt = 0;
  297. break;
  298. }
  299. tmp = tmp->next;
  300. }
  301. return rt;
  302. }
  303. int updateTransacLinkByPktOrHandle(int oper, TRANSACLINK **transacLink1, TRANSACLINK **transacLink2, Packet *pkt, UINT_8 msduH)
  304. {
  305. TRANSACLINK *tmp;
  306. int rt;
  307. //purge first if (oper == tr_oper_est)
  308. if (oper == tr_oper_est)
  309. purgeTransacLink(transacLink1,transacLink2);
  310. rt = 1;
  311. tmp = *transacLink1;
  312. while(tmp != NULL)
  313. {
  314. if(((pkt != NULL)&&(tmp->pkt == pkt))
  315.  ||((pkt == NULL)&&(tmp->msduHandle == msduH)))
  316. {
  317. if (oper == tr_oper_del) //delete an element
  318. {
  319. if(tmp->last != NULL)
  320. {
  321. tmp->last->next = tmp->next;
  322. if(tmp->next != NULL)
  323. tmp->next->last = tmp->last;
  324. else
  325. *transacLink2 = tmp->last;
  326. }
  327. else if (tmp->next != NULL)
  328. {
  329. *transacLink1 = tmp->next;
  330. tmp->next->last = NULL;
  331. }
  332. else
  333. {
  334. *transacLink1 = NULL;
  335. *transacLink2 = NULL;
  336. }
  337. //free the packet first
  338. Packet::free(tmp->pkt);
  339. delete tmp;
  340. }
  341. rt = 0;
  342. break;
  343. }
  344. tmp = tmp->next;
  345. }
  346. return rt;
  347. }
  348. int numberTransacLink(TRANSACLINK **transacLink1, TRANSACLINK **transacLink2)
  349. {
  350. //return the number of transactions in the link
  351. TRANSACLINK *tmp;
  352. int num;
  353. //purge first
  354. purgeTransacLink(transacLink1,transacLink2);
  355. num = 0;
  356. tmp = *transacLink1;
  357. while(tmp != NULL)
  358. {
  359. num++;
  360. tmp = tmp->next;
  361. }
  362. return num;
  363. }
  364. int chkAddTransacLink(TRANSACLINK **transacLink1, TRANSACLINK **transacLink2, UINT_8 pendAM, IE3ADDR pendAddr, Packet *p, UINT_8 msduH, double kpTime)
  365. {
  366. int i;
  367. //purge first
  368. purgeTransacLink(transacLink1,transacLink2);
  369. i = numberTransacLink(transacLink1,transacLink2);
  370. if (i >= maxNumTransactions) return 1;
  371. i = addTransacLink(transacLink1,transacLink2,pendAM,pendAddr,p,msduH,kpTime);
  372. if (i == 0) return 0;
  373. else return 2;
  374. }
  375. void emptyTransacLink(TRANSACLINK **transacLink1, TRANSACLINK **transacLink2)
  376. {
  377. TRANSACLINK *tmp, *tmp2;
  378. if(*transacLink1 != NULL)
  379. {
  380. tmp = *transacLink1;
  381. while(tmp != NULL)
  382. {
  383. tmp2 = tmp;
  384. tmp = tmp->next;
  385. //free the packet first
  386. Packet::free(tmp2->pkt);
  387. delete tmp2;
  388. }
  389. *transacLink1 = NULL;
  390. }
  391. *transacLink2 = *transacLink1;
  392. }
  393. void dumpTransacLink(TRANSACLINK *transacLink1, IE3ADDR coorAddr)
  394. {
  395. TRANSACLINK *tmp;
  396. int i;
  397. char tmpstr[121],tmpstr2[61];
  398. FrameCtrl frmCtrl;
  399. fprintf(stdout, "[%.2f] --- dump transaction list (by coordinator %d) ---n", Scheduler::instance().clock(), coorAddr);
  400. tmp = transacLink1;
  401. i = 1;
  402. while(tmp != NULL)
  403. {
  404. sprintf(tmpstr, "t%d:t",i);
  405. if (tmp->pendAddrMode == defFrmCtrl_AddrMode16)
  406. sprintf(tmpstr2,"pendAddrMode = 16-bittpendAddr = %dt",tmp->pendAddr16);
  407. else
  408. sprintf(tmpstr2,"pendAddrMode = 64-bittpendAddr = %dt",tmp->pendAddr64);
  409. strcat(tmpstr,tmpstr2);
  410. frmCtrl.FrmCtrl = HDR_LRWPAN(tmp->pkt)->MHR_FrmCtrl;
  411. frmCtrl.parse();
  412. if (frmCtrl.frmType == defFrmCtrl_Type_Data)
  413. strcat(tmpstr,"pktType = datat");
  414. else
  415. strcat(tmpstr,"pktType = commandt");
  416. sprintf(tmpstr2,"expTime = %fn",tmp->expTime);
  417. strcat(tmpstr,tmpstr2);
  418. fprintf(stdout, "%sn", tmpstr);
  419. tmp = tmp->next;
  420. i++;
  421. }
  422. }
  423. // End of file: p802_15_4transac.cc