Chinaunix首页 | 论坛 | 博客
  • 博客访问: 795044
  • 博文数量: 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:24:55

转:http://blog.csdn.net/nerdx/article/details/12279949
  1. //  开启网桥设备  
  2. //  调用路径dev_open->br_dev_open  
  3. //      函数主要任务:  
  4. //          1.开启传输队列  
  5. //          2.使能网桥  
  6. 1.1 static int br_dev_open(struct net_device *dev)  
  7. {  
  8.     //开启的传输功能,清除dev->state的__LINK_STATE_XOFF标志  
  9.     netif_start_queue(dev);  
  10.   
  11.     br_stp_enable_bridge(dev->priv);//使能网桥  
  12.   
  13.     return 0;  
  14. }  
  15.   
  16. //  使能网桥  
  17. //  调用路径dev_open->br_dev_open->br_stp_enable_bridge  
  18. //      函数主要任务:  
  19. //          1.设置网桥为根网桥  
  20. //          2.在每个指定端口上发送配置bpdu  
  21. //          3.使能网桥的每个端口  
  22. 1.2 void br_stp_enable_bridge(struct net_bridge *br)  
  23. {  
  24.     struct net_bridge_port *p;  
  25.   
  26.     spin_lock_bh(&br->lock);  
  27.     mod_timer(&br->hello_timer, jiffies + br->hello_time);//更新发送helloBPDU定时器  
  28.     br_config_bpdu_generation(br);//在每个使能的指定端口,发送配置BPDU,在端口被添加到网桥时,会自动指派其为指定端口,端口关闭时,也会被重置为指定角色  
  29.   
  30.     list_for_each_entry(p, &br->port_list, list) {//遍历此网桥的所有端口  
  31.         if ((p->dev->flags & IFF_UP) && netif_carrier_ok(p->dev))//设备开启,检测dev->states是否清除了__LINK_STATE_NOCARRIER标志  
  32.             br_stp_enable_port(p);//开启端口的stp  
  33.     }  
  34.     spin_unlock_bh(&br->lock);  
  35. }  
  36.   
  37. // 发送配置bpdu  
  38. // 函数主要任务:  
  39. //      1.遍历所有端口  
  40. //          1.1如果端口为指定端口,并且端口已经使能,则发送配置BPDU  
  41. 1.3 void br_config_bpdu_generation(struct net_bridge *br)  
  42. {  
  43.     struct net_bridge_port *p;  
  44.   
  45.     list_for_each_entry(p, &br->port_list, list) {//在每个指定端口发送配置BPDU  
  46.         if (p->state != BR_STATE_DISABLED &&//端口使能  
  47.             br_is_designated_port(p))//为指定端口  
  48.             br_transmit_config(p);//发送配置BPDU  
  49.     }  
  50. }  
  51. //  使能端口  
  52. //  函数主要任务:  
  53. //      1.初始化端口  
  54. //      2.开启端口的状态选择  
  55. 1.4 void br_stp_enable_port(struct net_bridge_port *p)  
  56. {  
  57.     br_init_port(p);//初始化端口  
  58.     br_port_state_selection(p->br);//开始执行端口状态的变化  
  59. }  
  60. //  初始化端口  
  61. //  调用路径:br_stp_enable_port->br_init_port  
  62. //  函数主要任务:  
  63. //      1.计算端口id  
  64. //      2.设置端口为指定角色  
  65. //      3.设置端口为阻塞状态  
  66. //      4.初始化端口的定时器   
  67. 1.5 void br_init_port(struct net_bridge_port *p)  
  68. {  
  69.     p->port_id = br_make_port_id(p->priority, p->port_no);//创建端口id  
  70.     br_become_designated_port(p);//使能端口时,端口均被指派为指定端口的角色  
  71.     p->state = BR_STATE_BLOCKING;//起始状态为阻塞态  
  72.     p->topology_change_ack = 0;//  
  73.     p->config_pending = 0;  
  74.   
  75.     br_stp_port_timer_init(p);//初始化端口使用的三个定时器message age, forward delay,hold  
  76. }  
  77.   
  78. //  关闭网桥设备  
  79. //  函数主要任务:  
  80. //      1.disable网桥设备  
  81. //      2.关闭设备队列  
  82. //调用路径dev_close->br_dev_stop  
  83. 2.1 static int br_dev_stop(struct net_device *dev)  
  84. {  
  85.     br_stp_disable_bridge(dev->priv);//disable网桥  
  86.   
  87.     netif_stop_queue(dev);//修改dev->state,关闭传输传输  
  88.   
  89.     return 0;  
  90. }  
  91.   
  92. //  disable网桥  
  93. //  函数主要功能:  
  94. //      1.关闭所有端口  
  95. //      2.设置标志没有拓扑变化  
  96. //      3.删除网桥使用的定时器  
  97. //调用路径dev_close->br_dev_stop->br_stp_disable_bridge  
  98. 2.2 void br_stp_disable_bridge(struct net_bridge *br)  
  99. {  
  100.     struct net_bridge_port *p;  
  101.   
  102.     spin_lock(&br->lock);//获取桥的锁  
  103.     list_for_each_entry(p, &br->port_list, list) {  
  104.         if (p->state != BR_STATE_DISABLED)  
  105.             br_stp_disable_port(p);//关闭每个端口的stp,设置其为指定端口  
  106.   
  107.     }  
  108.   
  109.     br->topology_change = 0;  
  110.     br->topology_change_detected = 0;  
  111.     spin_unlock(&br->lock);  
  112.     //同步删除网桥的定时器  
  113.     del_timer_sync(&br->hello_timer);  
  114.     del_timer_sync(&br->topology_change_timer);  
  115.     del_timer_sync(&br->tcn_timer);  
  116. }  
  117.   
  118. //  disable网桥端口:  
  119. //  函数主要任务:  
  120. //      1.设置为指定端口角色  
  121. //      2.删除端口使用的定时器  
  122. //      3.由于端口关闭而更新网桥配置  
  123. //      4.设置端口状态  
  124. //      3.由于端口的关闭,使非根网桥变为根网桥,更新网桥信息  
  125. //调用路径dev_close->br_dev_stop->br_stp_disable_bridge->br_stp_disable_port  
  126. 2.3 void br_stp_disable_port(struct net_bridge_port *p)  
  127. {  
  128.     struct net_bridge *br;  
  129.     int wasroot;  
  130.   
  131.     br = p->br;  
  132.     printk(KERN_INFO "%s: port %i(%s) entering %s state\n",  
  133.            br->dev->name, p->port_no, p->dev->name, "disabled");  
  134.   
  135.     wasroot = br_is_root_bridge(br);//根网桥  
  136.     br_become_designated_port(p);//关闭端口stp时,也会重置端口为指定端口  
  137.     p->state = BR_STATE_DISABLED;//设置端口为关闭状态  
  138.     p->topology_change_ack = 0;  
  139.     p->config_pending = 0;  
  140.   
  141.     //删除定时器  
  142.     del_timer(&p->message_age_timer);  
  143.     del_timer(&p->forward_delay_timer);  
  144.     del_timer(&p->hold_timer);  
  145.     //更新网桥配置  
  146.     br_configuration_update(br);  
  147.     //端口状态选择  
  148.     br_port_state_selection(br);  
  149.     //非根网桥转变为根网桥,  
  150.     if (br_is_root_bridge(br) && !wasroot)  
  151.         br_become_root_bridge(br);  
  152. }  
  153. //  成为网桥:  
  154. //  被调用情景:  
  155. //      当网桥由非根网桥变化为根网桥时,调用。  
  156. //  函数主要任务:  
  157. //      1.每个网桥在启动时,在birdge_max_age, bridge_hello_time, bridge_forward_delay字段保存当自己成为根网桥时使用的到期时间。  
  158. //      2.更新定时器使用的到期时间。  
  159. //      3.设置网桥发生了拓扑变化。  
  160. //      4.发送配置信息。  
  161. 2.4 void br_become_root_bridge(struct net_bridge *br)  
  162. {  
  163.          br->max_age = br->bridge_max_age;  
  164.          br->hello_time = br->bridge_hello_time;  
  165.          br->forward_delay = br->bridge_forward_delay;  
  166.          br_topology_change_detection(br);//拓扑发生改变  
  167.          del_timer(&br->tcn_timer);  
  168.    
  169.          if (br->dev->flags & IFF_UP) {//根网桥开启状态  
  170.                  br_config_bpdu_generation(br);//发送配置信息  
  171.                  mod_timer(&br->hello_timer, jiffies + br->hello_time);  
  172.          }  
  173. }  
  174.   
  175. //  拓扑发生变化:  
  176. //  函数主要任务:  
  177. //      1.如果为根网桥  
  178. //          1.1 启动topology_change_timer定时器  
  179. //          1.2 设置topology_change标志  
  180. //      2.非根网桥,之前没有检测到拓扑变化  
  181. //          2.1 发送设有tc标志的配置bpdu  
  182. //          2.2 启动tcn_timer定时器  
  183. //      3.设置topology_change_detected=1,表示拓扑变化被检测到。  
  184. 2.5 void br_topology_change_detection(struct net_bridge *br)  
  185. {  
  186.          int isroot = br_is_root_bridge(br);  
  187.    
  188.          if (isroot) {  
  189.                  br->topology_change = 1;  
  190.                  mod_timer(&br->topology_change_timer, jiffies  
  191.                            + br->bridge_forward_delay + br->bridge_max_age);  
  192.          } else if (!br->topology_change_detected) {  
  193.                  br_transmit_tcn(br);  
  194.                  mod_timer(&br->tcn_timer, jiffies + br->bridge_hello_time);  
  195.          }  
  196.    
  197.          br->topology_change_detected = 1;  
  198. }  
阅读(673) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~