📄 route.lst
字号:
246:route.c **** nbrTable[location].outdegree = outdegree;
247:route.c **** } else {
248:route.c **** if(freerecorder >= 1 ) {//路由表中还有空间
249:route.c **** location = GetAnFreePlace();
250:route.c **** nbrTable[location].addr = sourceaddr;
251:route.c **** if(LocalAddrInReceive(receivemsg)){
252:route.c **** nbrTable[location].state = SYMMETRICAL;
253:route.c **** if (hopcount < ( metric - 1 ) ) {
254:route.c **** metric = hopcount + 1;
255:route.c **** if(acceptable&&(outdegree >= 1 )) InParentBool(nbrTable[location].addr,location
256:route.c **** }
257:route.c **** } else {
258:route.c **** nbrTable[location].state = NOSYMMETRICAL;
259:route.c **** }
260:route.c **** nbrTable[location].metric = hopcount;
261:route.c **** nbrTable[location].broadseqno = broadno;
262:route.c **** nbrTable[location].prebroadseqno = nbrTable[location].broadseqno;
263:route.c **** nbrTable[location].sendfailtime = 0;
264:route.c **** nbrTable[location].outdegree = outdegree;
265:route.c **** freerecorder--;
266:route.c **** //这里可以加入发送路由包的任务,加快路由标的更新速度
267:route.c **** } else { //路由表满,启动替换策略
268:route.c **** location = GetAnPlace();
269:route.c **** if(location < MAXNEIGHBOR ) {
270:route.c **** nbrTable[location].addr = sourceaddr;
271:route.c **** parentpool[location] = INVALID_NODE_ID;//替换先消去
272:route.c **** if(LocalAddrInReceive(receivemsg)){
273:route.c **** nbrTable[location].state = SYMMETRICAL;
274:route.c **** if (hopcount < ( metric - 1 ) ) {
275:route.c **** metric = hopcount + 1;
276:route.c **** if(acceptable&&(outdegree >= 1 )) InParentBool(nbrTable[location].addr,loca
277:route.c **** }
278:route.c **** } else {
279:route.c **** nbrTable[location].state = NOSYMMETRICAL;
280:route.c **** }
281:route.c **** nbrTable[location].metric = hopcount;
282:route.c **** nbrTable[location].broadseqno = broadno;
283:route.c **** nbrTable[location].prebroadseqno = nbrTable[location].broadseqno;
284:route.c **** nbrTable[location].sendfailtime = 0;
285:route.c **** nbrTable[location].outdegree = outdegree;
286:route.c **** }
287:route.c **** }
288:route.c **** }
289:route.c **** }
290:route.c ****
291:route.c **** /*************************************************************************
292:route.c **** *功能描述:找到相关的邻居表中的纪录项,不过该数据项一定要在表项中
293:route.c **** *参数说明:需要寻找的节点号
294:route.c **** *返回值: 节点在表项中的位置
295:route.c **** *************************************************************************/
296:route.c **** static uint8_t GetLocation(uint8_t addr){
297:route.c **** uint8_t i;
298:route.c **** for(i = 0 ;i < MAXNEIGHBOR; i++) {
299:route.c **** if( nbrTable[i].addr == addr ) return i;
300:route.c **** }
301:route.c **** }
302:route.c ****
303:route.c **** /*************************************************************************
304:route.c **** *功能描述: 检查路由包的源节点是否在本地的邻居表中
305:route.c **** *参数说明:路由包的源节点号
306:route.c **** *返回值: TRUE OR FALSE
307:route.c **** *************************************************************************/
308:route.c **** static result_t ReceiveInLocal(uint8_t sourceaddr){
309:route.c **** uint8_t i;
310:route.c **** for(i = 0 ;i < MAXNEIGHBOR; i++) {
311:route.c **** if( nbrTable[i].addr == sourceaddr ) return 1;
312:route.c **** }
313:route.c **** return 0;
314:route.c **** }
315:route.c ****
316:route.c **** /*************************************************************************
317:route.c **** *功能描述: 检查路由包的源节点的邻居表中是否包含本地节点号
318:route.c **** *参数说明:接受到的数据包的指针
319:route.c **** *返回值: TRUE OR FALSE
320:route.c **** *************************************************************************/
321:route.c **** static result_t LocalAddrInReceive(OSMACMsgPtr receivemsg){
555 .LM70:
556 /* prologue: frame size=0 */
557 /* prologue end (size=0) */
322:route.c **** uint8_t i;
323:route.c **** SHopMsgPtr sHopMsg;
324:route.c **** sHopMsg = (SHopMsgPtr )receivemsg->data;
325:route.c **** RoutePacket *broadPacket = (RoutePacket *) sHopMsg->data;
326:route.c **** for(i = 0; i < MAXNEIGHBOR; i++) {
559 .LM71:
560 0206 20E0 ldi r18,lo8(0)
561 0208 3091 0000 lds r19,OS_LOCAL_ADDRESS
562 020c FC01 movw r30,r24
563 020e 3C96 adiw r30,12
564 .L62:
327:route.c **** if( broadPacket->neighbor[i] == OS_LOCAL_ADDRESS ) return 1;
566 .LM72:
567 0210 8191 ld r24,Z+
568 0212 8317 cp r24,r19
569 0214 19F4 brne .L60
570 0216 81E0 ldi r24,lo8(1)
571 0218 90E0 ldi r25,hi8(1)
572 021a 0895 ret
573 .L60:
575 .LM73:
576 021c 2F5F subi r18,lo8(-(1))
577 021e 2E31 cpi r18,lo8(30)
578 0220 B8F3 brlo .L62
328:route.c **** }
329:route.c **** return 0;
580 .LM74:
581 0222 80E0 ldi r24,lo8(0)
582 0224 90E0 ldi r25,hi8(0)
330:route.c ****
331:route.c **** }
584 .LM75:
585 0226 0895 ret
586 /* epilogue: frame size=0 */
587 0228 0895 ret
588 /* epilogue end (size=1) */
589 /* function LocalAddrInReceive size 18 (17) */
596 InParentBool:
332:route.c ****
333:route.c **** static void InParentBool(uint8_t addr,uint8_t location){
598 .LM76:
599 /* prologue: frame size=0 */
600 /* prologue end (size=0) */
334:route.c **** //入下一跳备选节点缓冲池
335:route.c **** parentpool[location] = addr;
602 .LM77:
603 022a E0E0 ldi r30,lo8(parentpool)
604 022c F0E0 ldi r31,hi8(parentpool)
605 022e E60F add r30,r22
606 0230 F11D adc r31,__zero_reg__
607 0232 8083 st Z,r24
608 /* epilogue: frame size=0 */
609 0234 0895 ret
610 /* epilogue end (size=1) */
611 /* function InParentBool size 6 (5) */
615 ChooseParent:
336:route.c **** }
337:route.c **** ////////////////////////////////////////////////////////////////
338:route.c **** //这一部分用来获得一个放置新收到的节点信息的表项位置
339:route.c **** ///////////////////////////////////////////////////////////////
340:route.c **** /*************************************************************************
341:route.c **** *功能描述: 邻居表还有空间,获得一个空间
342:route.c **** *参数说明:
343:route.c **** *返回值: 空闲空间的位置
344:route.c **** *************************************************************************/
345:route.c **** static result_t GetAnFreePlace(void){
346:route.c **** uint8_t i;
347:route.c **** for(i = 0 ;i < MAXNEIGHBOR; i++) {
348:route.c **** if( nbrTable[i].addr == INVALID_NODE_ID ) return i;
349:route.c **** }
350:route.c **** }
351:route.c ****
352:route.c **** /*************************************************************************
353:route.c **** *功能描述: 邻居表满,找到一个替换的空间
354:route.c **** *参数说明:接受到的数据包的指针
355:route.c **** *返回值: TRUE OR FALSE
356:route.c **** *************************************************************************/
357:route.c **** static uint8_t GetAnPlace(void){
358:route.c **** uint8_t replace;
359:route.c **** replace = GetNoSym();
360:route.c **** if(replace > MAXNEIGHBOR) {
361:route.c **** replace = GetEqualMetric();
362:route.c **** }
363:route.c **** return replace;
364:route.c **** }
365:route.c ****
366:route.c **** /*************************************************************************
367:route.c **** *功能描述: 找链路状况非对称的替换表项
368:route.c **** *参数说明:
369:route.c **** *返回值: 如果找到就返回位置,否则返回一个无效的值
370:route.c **** *************************************************************************/
371:route.c **** static uint8_t GetNoSym(void){
372:route.c **** uint8_t i;
373:route.c **** if(flag == 0){
374:route.c **** flag = 1;
375:route.c **** for(i = 0 ;i < MAXNEIGHBOR; i++) {
376:route.c **** if(nbrTable[i].state == NOSYMMETRICAL) return i;
377:route.c **** }
378:route.c **** } else {
379:route.c **** flag = 0;
380:route.c **** for(i = MAXNEIGHBOR ;i > 0; i--) { //避免溢出
381:route.c **** if(nbrTable[i - 1].state == NOSYMMETRICAL) return (i - 1);
382:route.c **** }
383:route.c **** }
384:route.c **** return (MAXNEIGHBOR + 10);
385:route.c **** }
386:route.c ****
387:route.c **** /*************************************************************************
388:route.c **** *功能描述: 找到层数==本地节点的替换表项
389:route.c **** *参数说明:
390:route.c **** *返回值: 如果找到就返回位置,否则返回一个无效的值
391:route.c **** *************************************************************************/
392:route.c **** static uint8_t GetEqualMetric(void){
393:route.c **** uint8_t i;
394:route.c **** for(i = 0 ;i < MAXNEIGHBOR; i++) {
395:route.c **** if(nbrTable[i].metric == metric) {
396:route.c **** return i;
397:route.c **** }
398:route.c **** }
399:route.c **** return (MAXNEIGHBOR + 10);
400:route.c **** }
401:route.c ****
402:route.c **** /*************************************************************************
403:route.c **** *功能描述: 找到层数<本地节点的替换表项
404:route.c **** *参数说明:
405:route.c **** *返回值: 如果找到就返回位置,否则返回一个无效的值
406:route.c **** *************************************************************************/
407:route.c **** /*
408:route.c **** static uint8_t GetLowMetric(void){
409:route.c **** uint8_t i;
410:route.c **** for(i = 0 ;i < MAXNEIGHBOR; i++) {
411:route.c **** if(nbrTable[i].metric < metric ){
412:route.c **** if(nbrTable[i].sendfailtime == 0) return i;
413:route.c **** }
414:route.c **** }
415:route.c **** return (MAXNEIGHBOR + 10);
416:route.c **** }
417:route.c **** */
418:route.c **** /////////////////////////////////////////////////////////////////////////
419:route.c **** //选择下一跳的节点号
420:route.c **** ////////////////////////////////////////////////////////////////////////
421:route.c **** /*************************************************************************
422:route.c **** *功能描述: 找到下一跳的节点号
423:route.c **** *参数说明:
424:route.c **** *返回值:
425:route.c **** *************************************************************************/
426:route.c **** static void ChooseParent(void){
617 .LM78:
618 /* prologue: frame size=0 */
619 0236 CF93 push r28
620 0238 DF93 push r29
621 /* prologue end (size=2) */
622 .LBB10:
623 .LBB11:
427:route.c **** uint8_t i;
428:route.c **** uint8_t location;
429:route.c **** location = GetPerfect();//选择最好的下一跳,即有对称性,层数最低的那一项
430:route.c **** if( location < MAXNEIGHBOR ) {
431:route.c **** i = location + 1;
432:route.c **** for( ; i < MAXNEIGHBOR ;i++){
433:route.c **** //进一步寻找最优的点
434:route.c **** if((nbrTable[i].state == SYMMETRICAL)&&(nbrTable[i].metric <= nbrTable[location].metric )) {
435:route.c **** if((nbrTable[i].metric < nbrTable[location].metric)&&(nbrTable[i].outdegree >= 1)) location
436:route.c **** else if((nbrTable[i].metric == nbrTable[location].metric)\
437:route.c **** &&(nbrTable[i].outdegree > nbrTable[location].outdegree)) location = i;
438:route.c **** }
439:route.c **** }
440:route.c **** }
441:route.c ****
442:route.c **** if(location < MAXNEIGHBOR ) {
443:route.c **** currentparent = nbrTable[location].addr;
444:route.c **** } else { //找不到合适的下一跳节点
445:route.c **** currentparent = INVALID_NODE_ID;
446:route.c **** }
447:route.c ****
448:route.c **** if( OS_LOCAL_ADDRESS != SINKNODE ) {
449:route.c **** if(currentparent == INVALID_NODE_ID ){ //层数下降要加速通报
450:route.c **** if(metric < INVALID_NODE_ID) metric++;
451:route.c **** else metric = INVALID_NODE_ID;
452:route.c **** OSPostTask(routeBroadcast);
453:route.c **** }
454:route.c **** }
455:route.c **** }
456:route.c ****
457:route.c **** /*************************************************************************
458:route.c **** *功能描述: 找到一个比较优的下一跳节点号
459:route.c **** *参数说明:
460:route.c **** *返回值: 如果找到就返回位置,否则返回一个无效的值
461:route.c **** *************************************************************************/
462:route.c **** static uint8_t GetPerfect(void){
463:route.c **** uint8_t i;
464:route.c **** for(i = 0 ;i < MAXNEIGHBOR; i++) {
625 .LM79:
626 023a 90E0 ldi r25,lo8(0)
627 023c 4091 0000 lds r20,metric
628 0240 E0E0 ldi r30,lo8(nbrTable)
629 0242 F0E0 ldi r31,hi8(nbrTable)
630 0244 20E0 ldi r18,lo8(0)
631 0246 30E0 ldi r19,hi8(0)
632 .L72:
465:route.c **** //找到一个合适的最优解
466:route.c **** if((nbrTable[i].state == SYMMETRICAL)&&(nbrTable[i].metric < metric )\
634 .LM80:
635 0248 8181 ldd r24,Z+1
636 024a 8130 cpi r24,lo8(1)
637 024c 39F4 brne .L69
638 024e 8281 ldd r24,Z+2
639 0250 8417 cp r24,r20
640 0252 20F4 brsh .L69
641 0254 8085 ldd r24,Z+8
642 0256 8823 tst r24
643 0258 09F0 breq .+2
644 025a 56C0 rjmp .L91
645 .L69:
647 .LM81:
648 025c 9F5F subi r25,lo8(-(1))
649 025e 2F5F subi r18,lo8(-(1))
650 0260 3F4F sbci r19,hi8(-(1))
651 0262 3996 adiw r30,9
652 0264 9E31 cpi r25,lo8(30)
653 0266 80F3 brlo .L72
467:route.c **** &&(nbrTable[i].outdegree >=1)) return i;
468:route.c **** }
655 .LM82:
656 0268 88E2 ldi r24,lo8(40)
657 026a 90E0 ldi r25,hi8(40)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -