Chinaunix首页 | 论坛 | 博客
  • 博客访问: 795007
  • 博文数量: 264
  • 博客积分: 592
  • 博客等级: 中士
  • 技术积分: 1574
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-24 22:02
文章分类

全部博文(264)

文章存档

2019年(2)

2018年(1)

2017年(1)

2016年(4)

2015年(14)

2014年(57)

2013年(88)

2012年(97)

分类: LINUX

2014-02-12 15:26:06

转:http://blog.csdn.net/nerdx/article/details/12280945
  1. //  更新网桥配置信息  
  2. //  函数主要任务:  
  3. //      1.重新选择根端口  
  4. //      2.重新选择根网桥  
  5. 1.1 void br_configuration_update(struct net_bridge *br)  
  6. {  
  7.     br_root_selection(br);//选择根端口,根网桥  
  8.     br_designated_port_selection(br);//选择指定端口  
  9. }  
  10.   
  11. //  选择根端口  
  12. //  调用路径:br_configuration_update->br_root_selection  
  13. //  函数主要任务:  
  14. //      1.遍历所有端口,选择具备成为根端口的端口  
  15. //      2.没有选择出根端口,则更新网桥成为根网桥  
  16. //      3.否则更新可到达的根网桥,根路径开销  
  17.   
  18. //  注:  
  19. //      1.网桥的根路径开销 = 根端口的指定开销+端口的根路径开销  
  20. 1.2 static void br_root_selection(struct net_bridge *br)  
  21. {  
  22.     struct net_bridge_port *p;  
  23.     u16 root_port = 0;  
  24.   
  25.     list_for_each_entry(p, &br->port_list, list) {//遍历所有端口  
  26.         if (br_should_become_root_port(p, root_port))//判断端口是否应该成为根端口  
  27.             root_port = p->port_no;//根端口id  
  28.     }  
  29.   
  30.     br->root_port = root_port;//网桥的根端口  
  31.   
  32.     if (!root_port) {//没有选出合适的根端口  
  33.         br->designated_root = br->bridge_id;//设置自己为根网桥,开始新一轮的网络拓扑检测  
  34.         br->root_path_cost = 0;  
  35.     } else {//成功选出根端口  
  36.         p = br_get_port(br, root_port);  
  37.         br->designated_root = p->designated_root;//此端口到达的根  
  38.         br->root_path_cost = p->designated_cost + p->path_cost;//计算路径开销  
  39.     }  
  40. }  
  41.   
  42.   
  43. //  端口成为根端口的条件  
  44.   
  45. //  成为根端口的条件:  
  46. //      1.端口优先级高于网桥优先级  
  47. //      2.该端口<到达的根网桥优先级, 到达根网桥的开销, 直连的网桥id的优先级>  
  48. //      与根端口<到达的根网桥优先级, 到达根网桥的开销, 直连的网桥id的优先级>  
  49. //      优先级高的,可以成为根端口  
  50. 1.3 static int br_should_become_root_port(const struct net_bridge_port *p,   
  51.                       u16 root_port)  
  52. {  
  53.     struct net_bridge *br;  
  54.     struct net_bridge_port *rp;  
  55.     int t;  
  56.   
  57.     br = p->br;  
  58.     if (p->state == BR_STATE_DISABLED ||  
  59.         br_is_designated_port(p))//如果端口被关闭,或者为指定端口  
  60.         return 0;  
  61.   
  62.     if (memcmp(&br->bridge_id, &p->designated_root, 8) <= 0)//网桥的id优先级高于等于端口能到达的根网桥的优先级  
  63.         return 0;  
  64.   
  65.     if (!root_port)//之前没有选择到根端口,并且此端口到达的根网桥的优先级高于此网桥  
  66.         return 1;  
  67.   
  68.     rp = br_get_port(br, root_port);//之前选择到的根端口  
  69.   
  70.     t = memcmp(&p->designated_root, &rp->designated_root, 8);//比较先前选择的根端口能到达的根网桥id与当前的端口能到达的根网桥id  
  71.     if (t < 0)//选择优先级高的  
  72.         return 1;  
  73.     else if (t > 0)  
  74.         return 0;  
  75.   
  76.     if (p->designated_cost + p->path_cost <  
  77.         rp->designated_cost + rp->path_cost)//选择根路径开销小的端口  
  78.         return 1;  
  79.     else if (p->designated_cost + p->path_cost >  
  80.          rp->designated_cost + rp->path_cost)  
  81.         return 0;  
  82.   
  83.     t = memcmp(&p->designated_bridge, &rp->designated_bridge, 8);//当前端口直连的网桥id的优先级与之前端口直连的网桥的id  
  84.     if (t < 0)  
  85.         return 1;  
  86.     else if (t > 0)  
  87.         return 0;  
  88.   
  89.     if (p->designated_port < rp->designated_port)//直连端口的id  
  90.         return 1;  
  91.     else if (p->designated_port > rp->designated_port)  
  92.         return 0;  
  93.   
  94.     if (p->port_id < rp->port_id)  
  95.         return 1;  
  96.   
  97.     return 0;  
  98. }  
  99.   
  100. //  选择指定端口  
  101. //  调用路径:br_configuration_update->br_designated_port_selection  
  102. //  函数主要任务:  
  103. //      1.遍历所有没有被关闭的端口  
  104. //      2.端口具备成为指定端口的条件  
  105. //      3.更新端口信息,成为指定端口  
  106. 1.4 static void br_designated_port_selection(struct net_bridge *br)  
  107. {  
  108.     struct net_bridge_port *p;  
  109.   
  110.     list_for_each_entry(p, &br->port_list, list) {  
  111.         if (p->state != BR_STATE_DISABLED &&  
  112.             br_should_become_designated_port(p))//如果当前端口应该成为指定端口  
  113.             br_become_designated_port(p);//则设置成为指定端口  
  114.   
  115.     }  
  116. }  
  117.   
  118. //  端口成为指定端口的条件  
  119. //  成为指定端口的条件:  
  120. //      1.端口能到达的根网桥,与网桥的根网桥不同,则满足  
  121. //      2.端口到达根网桥的路径开销,大于网桥的根路径开销,则满足  
  122. //      3.端口直连网桥id的优先级,小于本网桥id的优先级,则满足  
  123. 1.5 static int br_should_become_designated_port(const struct net_bridge_port *p)  
  124. {  
  125.     struct net_bridge *br;  
  126.     int t;  
  127.   
  128.     br = p->br;  
  129.     if (br_is_designated_port(p))//如果端口此时为指定端口,则保持此状态  
  130.         return 1;  
  131.   
  132.     if (memcmp(&p->designated_root, &br->designated_root, 8))//1.如果此端口能到达的根网桥非网桥的根网桥  
  133.         return 1;  
  134.   
  135.     if (br->root_path_cost < p->designated_cost)//2.如果网桥的根路径开销小于当前端口到达根网桥的开销  
  136.         return 1;  
  137.     else if (br->root_path_cost > p->designated_cost)  
  138.         return 0;  
  139.   
  140.     t = memcmp(&br->bridge_id, &p->designated_bridge, 8);//当前网桥id与端口直连的网桥id  
  141.     if (t < 0)//如果当前网桥的优先级高于端口直连的网桥的id  
  142.         return 1;  
  143.     else if (t > 0)  
  144.         return 0;  
  145.   
  146.     if (p->port_id < p->designated_port)//当前端口的id小于直连的端口的id  
  147.         return 1;  
  148.   
  149.     return 0;  
  150. }  
阅读(705) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~