




已阅读5页,还剩32页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
分类:ns仿真2012-05-28 20:231285人阅读评论(5)收藏举报dststructrtfdelaytclfunctioncppview plaincopy1. /#include2. 3. #include4. #include5. #include6. #include7. /#include8. 9. #definemax(a,b)(a)(b)?(a):(b)10. #defineCURRENT_TIMEScheduler:instance().clock()11. 12. /#defineDEBUG13. /#defineERROR14. 15. #ifdefDEBUG16. staticintextra_route_reply=0;17. staticintlimit_route_request=0;18. staticintroute_request=0;19. #endif20. 21. 22. /*23. TCLHooks24. */25. 26. 27. inthdr_aodv:offset_;28. staticclassAODVHeaderClass:publicPacketHeaderClass29. public:30. AODVHeaderClass():PacketHeaderClass(PacketHeader/AODV,31. sizeof(hdr_all_aodv)32. bind_offset(&hdr_aodv:offset_);33. 34. class_rtProtoAODV_hdr;35. /*AODVclass只有两个函数,构造函数和creat函数*/36. staticclassAODVclass:publicTclClass37. public:38. AODVclass():TclClass(Agent/AODV)39. TclObject*create(intargc,constchar*const*argv)40. assert(argc=5);41. /return(newAODV(nsaddr_t)atoi(argv4);42. return(newAODV(nsaddr_t)Address:instance().str2addr(argv4);43. 44. class_rtProtoAODV;45. 46. /*command函数实现了命令的分发*/47. int48. AODV:command(intargc,constchar*const*argv)49. if(argc=2)/命令的参数个数是250. Tcl&tcl=Tcl:instance();51. 52. if(strncasecmp(argv1,id,2)=0)/命令所要求的操作为id53. tcl.resultf(%d,index);54. returnTCL_OK;55. 56. 57. if(strncasecmp(argv1,start,2)=0)/命令所要求的操作为start58. btimer.handle(Event*)0);59. 60. #ifndefAODV_LINK_LAYER_DETECTION61. htimer.handle(Event*)0);62. ntimer.handle(Event*)0);63. #endif/LINKLAYERDETECTION64. 65. rtimer.handle(Event*)0);66. returnTCL_OK;67. 68. 69. elseif(argc=3)/命令参数个数等于370. if(strcmp(argv1,index)=0)/命令所要求的操作为index71. index=atoi(argv2);72. returnTCL_OK;73. 74. /命令所要求的操作为log-target或者tracetarget75. elseif(strcmp(argv1,log-target)=0|strcmp(argv1,tracetarget)=0)76. logtarget=(Trace*)TclObject:lookup(argv2);77. if(logtarget=0)78. returnTCL_ERROR;79. returnTCL_OK;80. 81. elseif(strcmp(argv1,drop-target)=0)82. 83. /命令所要求的操作为drop-target84. intstat=mand(argc,argv);85. if(stat!=TCL_OK)returnstat;86. returnAgent:command(argc,argv);87. 88. 89. /命令所要求的操作if-queue90. elseif(strcmp(argv1,if-queue)=0)91. ifqueue=(PriQueue*)TclObject:lookup(argv2);92. 93. if(ifqueue=0)94. returnTCL_ERROR;95. returnTCL_OK;96. 97. /命令所要求的操作为port-dmux98. elseif(strcmp(argv1,port-dmux)=0)99. dmux_=(PortClassifier*)TclObject:lookup(argv2);100. if(dmux_=0)101. fprintf(stderr,%s:%slookupof%sfailedn,_FILE_,102. argv1,argv2);103. returnTCL_ERROR;104. 105. returnTCL_OK;106. 107. 108. returnAgent:command(argc,argv);109. 110. 111. /*112. Constructor113. */114. 115. AODV:AODV(nsaddr_tid):Agent(PT_AODV),116. btimer(this),htimer(this),ntimer(this),117. rtimer(this),lrtimer(this),rqueue()118. 119. 120. index=id;121. seqno=2;122. bid=1;123. 124. LIST_INIT(&nbhead);125. LIST_INIT(&bihead);126. 127. logtarget=0;128. ifqueue=0;129. 130. 131. /*132. Timers133. */134. /广播定时器135. void136. BroadcastTimer:handle(Event*)137. agent-id_purge();138. Scheduler:instance().schedule(this,&intr,BCAST_ID_SAVE);139. 140. /hello报文定时器141. void142. HelloTimer:handle(Event*)143. agent-sendHello();144. doubleinterval=MinHelloInterval+145. (MaxHelloInterval-MinHelloInterval)*Random:uniform();146. assert(interval=0);147. Scheduler:instance().schedule(this,&intr,interval);148. 149. /邻居定时器150. void151. NeighborTimer:handle(Event*)152. agent-nb_purge();153. Scheduler:instance().schedule(this,&intr,HELLO_INTERVAL);154. 155. 路由缓存定时器156. void157. RouteCacheTimer:handle(Event*)158. agent-rt_purge();159. #defineFREQUENCY0.5/sec160. Scheduler:instance().schedule(this,&intr,FREQUENCY);161. 162. /路由缓存定时器163. void164. LocalRepairTimer:handle(Event*p)/SRD:5/4/99165. aodv_rt_entry*rt;166. structhdr_ip*ih=HDR_IP(Packet*)p);167. 168. /*yougethereafterthetimeoutinalocalrepairattempt*/169. /*fprintf(stderr,%sn,_FUNCTION_);*/170. 171. 172. rt=agent-rtable.rt_lookup(ih-daddr();173. 174. if(rt&rt-rt_flags!=RTF_UP)175. /routeisyettoberepaired176. /Iwillbeconservativeandbringdowntheroute177. /andsendrouteerrorsupstream.178. /*Thefollowingassertfails,notsurewhy*/179. /*assert(rt-rt_flags=RTF_IN_REPAIR);*/180. 181. /rt-rt_seqno+;182. agent-rt_down(rt);183. /sendRERR184. #ifdefDEBUG185. fprintf(stderr,Node%d:Dst-%d,failedlocalrepairn,index,rt-rt_dst);186. #endif187. 188. Packet:free(Packet*)p);189. 190. 191. 192. /*193. BroadcastIDManagementFunctions194. */195. 196. 197. void198. AODV:id_insert(nsaddr_tid,u_int32_tbid)199. BroadcastID*b=newBroadcastID(id,bid);200. 201. assert(b);202. b-expire=CURRENT_TIME+BCAST_ID_SAVE;203. LIST_INSERT_HEAD(&bihead,b,link);204. 205. 206. /*SRD*/207. bool208. AODV:id_lookup(nsaddr_tid,u_int32_tbid)209. BroadcastID*b=bihead.lh_first;210. 211. /Searchthelistforamatchofsourceandbid212. for(;b;b=b-link.le_next)213. if(b-src=id)&(b-id=bid)214. returntrue;215. 216. returnfalse;217. 218. 219. void220. AODV:id_purge()221. BroadcastID*b=bihead.lh_first;222. BroadcastID*bn;223. doublenow=CURRENT_TIME;224. 225. for(;b;b=bn)226. bn=b-link.le_next;227. if(b-expire=now)228. LIST_REMOVE(b,link);229. deleteb;230. 231. 232. 233. 234. /*235. HelperFunctions236. */237. 238. double239. AODV:PerHopTime(aodv_rt_entry*rt)240. intnum_non_zero=0,i;241. doubletotal_latency=0.0;242. 243. if(!rt)244. return(double)NODE_TRAVERSAL_TIME);245. 246. for(i=0;irt_disc_latencyi0.0)248. num_non_zero+;249. total_latency+=rt-rt_disc_latencyi;250. 251. 252. if(num_non_zero0)253. return(total_latency/(double)num_non_zero);254. else255. return(double)NODE_TRAVERSAL_TIME);256. 257. 258. 259. /*260. LinkFailureManagementFunctions261. */262. 263. staticvoid264. aodv_rt_failed_callback(Packet*p,void*arg)265. (AODV*)arg)-rt_ll_failed(p);266. 267. 268. /*269. *Thisroutineisinvokedwhenthelink-layerreportsaroutefailed.270. */271. /*邻居链路down掉,处理*/272. void273. AODV:rt_ll_failed(Packet*p)274. structhdr_cmn*ch=HDR_CMN(p);275. structhdr_ip*ih=HDR_IP(p);276. aodv_rt_entry*rt;277. nsaddr_tbroken_nbr=ch-next_hop_;/记录下一跳邻居的地址278. 279. #ifndefAODV_LINK_LAYER_DETECTION280. drop(p,DROP_RTR_MAC_CALLBACK);281. #else282. 283. /*284. *Non-datapacketsandBroadcastPacketscanbedropped.285. */286. /如果是非数据或者广播报文,则可以直接丢弃287. if(!DATA_PACKET(ch-ptype()|288. (u_int32_t)ih-daddr()=IP_BROADCAST)289. drop(p,DROP_RTR_MAC_CALLBACK);290. return;291. 292. log_link_broke(p);293. /如果不存在到达目的节点的路径,丢弃报文294. if(rt=rtable.rt_lookup(ih-daddr()=0)295. drop(p,DROP_RTR_MAC_CALLBACK);296. return;297. 298. log_link_del(ch-next_hop_);299. 300. #ifdefAODV_LOCAL_REPAIR301. /*ifthebrokenlinkisclosertothedestthansource,302. attemptalocalrepair.Otherwise,bringdowntheroute.*/303. 304. /如果转发的跳数大于到达目的节点的跳数,则进行路由修复;否则丢弃通过此邻居的305. /数据并且删除此邻居306. if(ch-num_forwards()rt-rt_hops)307. local_rt_repair(rt,p);/localrepair308. /retrieveallthepacketsintheifqusingthislink,309. /queuethepacketsforwhichlocalrepairisdone,310. return;311. 312. else313. #endif/LOCALREPAIR314. 315. 316. drop(p,DROP_RTR_MAC_CALLBACK);317. /Dothesamethingforotherpacketsintheinterfacequeueusingthe318. /brokenlink-Mahesh319. while(p=ifqueue-filter(broken_nbr)320. drop(p,DROP_RTR_MAC_CALLBACK);321. 322. nb_delete(broken_nbr);323. 324. 325. #endif/LINKLAYERDETECTION326. 327. /*当发现邻居失效的时候,就会调用此函数*/328. void329. AODV:handle_link_failure(nsaddr_tid)330. aodv_rt_entry*rt,*rtn;331. Packet*rerr=Packet:alloc();332. structhdr_aodv_error*re=HDR_AODV_ERROR(rerr);333. 334. re-DestCount=0;335. /查找通过此邻居节点到达目的的路由,336. for(rt=rtable.head();rt;rt=rtn)/foreachrtentry337. rtn=rt-rt_link.le_next;338. /如果跳数不是无限大并且下一跳就是失效的邻居339. if(rt-rt_hops!=INFINITY2)&(rt-rt_nexthop=id)340. assert(rt-rt_flags=RTF_UP);341. assert(rt-rt_seqno%2)=0);342. rt-rt_seqno+;343. re-unreachable_dstre-DestCount=rt-rt_dst;344. re-unreachable_dst_seqnore-DestCount=rt-rt_seqno;345. #ifdefDEBUG346. fprintf(stderr,%s(%f):%dt(%dt%ut%d)n,_FUNCTION_,CURRENT_TIME,347. index,re-unreachable_dstre-DestCount,348. re-unreachable_dst_seqnore-DestCount,rt-rt_nexthop);349. #endif/DEBUG350. re-DestCount+=1;351. rt_down(rt);/将此路由down掉352. 353. /removethelostneighborfromalltheprecursorlists354. rt-pc_delete(id);/删除此路由的前缀列表355. 356. /*如果存在通过此邻居到达目的节点的路由,则发送错误报文*/357. if(re-DestCount0)358. #ifdefDEBUG359. fprintf(stderr,%s(%f):%dtsendingRERR.n,_FUNCTION_,CURRENT_TIME,index);360. #endif/DEBUG361. sendError(rerr,false);362. 363. else364. Packet:free(rerr);365. 366. 367. 368. void369. AODV:local_rt_repair(aodv_rt_entry*rt,Packet*p)370. #ifdefDEBUG371. fprintf(stderr,%s:Dst-%dn,_FUNCTION_,rt-rt_dst);372. #endif373. /Bufferthepacket374. rqueue.enque(p);375. 376. /marktherouteasunderrepair377. rt-rt_flags=RTF_IN_REPAIR;378. 379. sendRequest(rt-rt_dst);380. 381. /setupatimerinterrupt382. Scheduler:instance().schedule(&lrtimer,p-copy(),rt-rt_req_timeout);383. 384. /*更新路由条目*/385. void386. AODV:rt_update(aodv_rt_entry*rt,u_int32_tseqnum,u_int16_tmetric,387. nsaddr_tnexthop,doubleexpire_time)388. 389. rt-rt_seqno=seqnum;390. rt-rt_hops=metric;391. rt-rt_flags=RTF_UP;392. rt-rt_nexthop=nexthop;393. rt-rt_expire=expire_time;394. 395. /*将此路由条目down掉*/396. void397. AODV:rt_down(aodv_rt_entry*rt)398. /*399. *Makesurethatyoudontdownaroutemorethanonce.400. */401. 402. if(rt-rt_flags=RTF_DOWN)403. return;404. 405. 406. /assert(rt-rt_seqno%2);/istheseqnoodd?407. rt-rt_last_hop_count=rt-rt_hops;408. rt-rt_hops=INFINITY2;409. rt-rt_flags=RTF_DOWN;410. rt-rt_nexthop=0;411. rt-rt_expire=0;412. 413. /*rt_downfunction*/414. 415. /*416. RouteHandlingFunctions417. */418. 419. void420. AODV:rt_resolve(Packet*p)421. structhdr_cmn*ch=HDR_CMN(p);422. structhdr_ip*ih=HDR_IP(p);423. aodv_rt_entry*rt;424. 425. /*426. *Setthetransmitfailurecallback.That427. *wontchange.428. */429. /这是一个指针,具体请看另一篇博客430. ch-xmit_failure_=aodv_rt_failed_callback;431. ch-xmit_failure_data_=(void*)this;432. rt=rtable.rt_lookup(ih-daddr();433. if(rt=0)434. rt=rtable.rt_add(ih-daddr();435. 436. 437. /*438. *Iftherouteisup,forwardthepacket439. */440. /如果存在路由,则转发441. if(rt-rt_flags=RTF_UP)442. assert(rt-rt_hops!=INFINITY2);443. forward(rt,p,NO_DELAY);444. 445. /*446. *ifIamthesourceofthepacket,thendoaRouteRequest.447. */448. elseif(ih-saddr()=index)449. /450. /如果是源节点且没有到达目的节点的路由,缓存数分组451. /发送路由请求452. rqueue.enque(p);453. sendRequest(rt-rt_dst);454. 455. /*456. *Alocalrepairisinprogress.Bufferthepacket.457. */458. /如果此路由处于修复状态,则缓存分组459. elseif(rt-rt_flags=RTF_IN_REPAIR)460. rqueue.enque(p);461. 462. 463. /*464. *Iamtryingtoforwardapacketforsomeoneelsetowhich465. *Idonthavearoute.466. */467. /否则发送错误报文468. else469. Packet*rerr=Packet:alloc();470. structhdr_aodv_error*re=HDR_AODV_ERROR(rerr);471. /*472. *Fornow,dropthepacketandsenderrorupstream.473. *Nowtherouteerrorsarebroadcasttoupstream474. *neighbors-Mahesh09/11/99475. */476. 477. assert(rt-rt_flags=RTF_DOWN);478. re-DestCount=0;479. re-unreachable_dstre-DestCount=rt-rt_dst;480. re-unreachable_dst_seqnore-DestCount=rt-rt_seqno;481. re-DestCount+=1;482. #ifdefDEBUG483. fprintf(stderr,%s:sendingRERR.n,_FUNCTION_);484. #endif485. sendError(rerr,false);486. 487. drop(p,DROP_RTR_NO_ROUTE);488. 489. 490. 491. /*定时查看路由缓存条目*/492. void493. AODV:rt_purge()494. aodv_rt_entry*rt,*rtn;495. doublenow=CURRENT_TIME;496. doubledelay=0.0;497. Packet*p;498. 499. for(rt=rtable.head();rt;rt=rtn)/foreachrtentry500. rtn=rt-rt_link.le_next;501. /如果此路由条目标注为有效,但是生存时间为0502. /丢弃前往目的分组,并且将此路由条目down掉503. if(rt-rt_flags=RTF_UP)&(rt-rt_expirert_hops!=INFINITY2);507. while(p=rqueue.deque(rt-rt_dst)508. #ifdefDEBUG509. fprintf(stderr,%s:callingdrop()n,510. _FUNCTION_);511. #endif/DEBUG512. drop(p,DROP_RTR_NO_ROUTE);513. 514. rt-rt_seqno+;515. assert(rt-rt_seqno%2);516. rt_down(rt);517. 518. /如果此路由条目并没有过期,则可以发送分组519. elseif(rt-rt_flags=RTF_UP)520. /Iftherouteisnotexpired,521. /andtherearepacketsinthesendbufferwaiting,522. /forwardthem.Thisshouldnotbeneeded,butthisextra523. /checkdoesnoharm.524. assert(rt-rt_hops!=INFINITY2);525. while(p=rqueue.deque(rt-rt_dst)526. forward(rt,p,delay);527. delay+=ARP_DELAY;528. 529. 530. /如果此路由条目已经down掉,但是有前往目的的分组,则发送路由请求531. elseif(rqueue.find(rt-rt_dst)532. /Iftherouteisdownand533. /ifthereisapacketforthisdestinationwaitingin534. /thesendbuffer,thensendoutrouterequest.sendRequest535. /willcheckwhetheritistimetoreallysendoutrequest536. /ornot.537. /Thismaynotbecrucialtodoithere,aseachgenerated538. /packetwilldoasendRequestanyway.539. 540. sendRequest(rt-rt_dst);541. 542. 543. 544. 545. /*546. PacketReceptionRoutines547. */548. 549. void550. AODV:recv(Packet*p,Handler*)551. structhdr_cmn*ch=HDR_CMN(p);552. structhdr_ip*ih=HDR_IP(p);553. 554. assert(initialized();555. /assert(p-incoming=0);556. /XXXXXNOTE:useofincomingflaghasbeendepracated;Inordertotrackdirectionofpktflow,direction_inhdr_cmnisusedinstead.seepacket.hfordetails.557. /如果分组类型是AODV类型,则交给recvAodv函数558. if(ch-ptype()=PT_AODV)559. ih-ttl_-=1;560. recvAODV(p);561. return;562.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 长春人文学院《汉字源流》2023-2024学年第一学期期末试卷
- 山西财贸职业技术学院《藏医心身概论》2023-2024学年第一学期期末试卷
- 四川司法警官职业学院《奥尔夫音乐教育》2023-2024学年第一学期期末试卷
- 山西机电职业技术学院《临床检验基础》2023-2024学年第一学期期末试卷
- DB4228T 013-2017 富硒猕猴桃生产技术规程
- 北京航空航天大学《日用陶瓷创新设计》2023-2024学年第一学期期末试卷
- 广西经贸职业技术学院《病原生物学与医学免疫学(实验)》2023-2024学年第一学期期末试卷
- 业主游玩活动方案
- 多元化活动周活动方案
- 大班榜样活动方案
- 学堂在线 公共管理学 章节测试答案
- 美术机构教师管理制度
- 2025年中国数据库市场研究报告
- 2024年包头市公安局招聘专职留置看护警务辅助人员笔试真题
- 【9语安徽中考卷】2025年安徽省中考招生考试真题语文试卷(真题+答案)
- 矿产资源国际合作-洞察及研究
- 【课件】无脊椎动物+第2课时课件-2024-2025学年人教版生物七年级上册
- 2025年凉山州昭觉县选聘社区工作者题库带答案分析
- 2025国开《调剂学(本)》形考任务1234答案
- 2025年员工持股平台合伙协议
- 2024-2025学年下学期初中道德与法治七年级期末复习试卷(含答案)
评论
0/150
提交评论