//   开启网桥设备
//  调用路径dev_open->br_dev_open
//      函数主要任务:
//          1.开启传输队列
//          2.使能网桥
1.1 static int br_dev_open(struct net_device *dev)
{//开启的传输功能,清除dev->state的__LINK_STATE_XOFF标志netif_start_queue(dev);br_stp_enable_bridge(dev->priv);//使能网桥return 0;
}// 使能网桥
//  调用路径dev_open->br_dev_open->br_stp_enable_bridge
//      函数主要任务:
//          1.设置网桥为根网桥
//          2.在每个指定端口上发送配置bpdu
//          3.使能网桥的每个端口
1.2 void br_stp_enable_bridge(struct net_bridge *br)
{struct net_bridge_port *p;spin_lock_bh(&br->lock);mod_timer(&br->hello_timer, jiffies + br->hello_time);//更新发送helloBPDU定时器br_config_bpdu_generation(br);//在每个使能的指定端口,发送配置BPDU,在端口被添加到网桥时,会自动指派其为指定端口,端口关闭时,也会被重置为指定角色list_for_each_entry(p, &br->port_list, list) {//遍历此网桥的所有端口if ((p->dev->flags & IFF_UP) && netif_carrier_ok(p->dev))//设备开启,检测dev->states是否清除了__LINK_STATE_NOCARRIER标志br_stp_enable_port(p);//开启端口的stp}spin_unlock_bh(&br->lock);
}// 发送配置bpdu
// 函数主要任务:
//      1.遍历所有端口
//          1.1如果端口为指定端口,并且端口已经使能,则发送配置BPDU
1.3 void br_config_bpdu_generation(struct net_bridge *br)
{struct net_bridge_port *p;list_for_each_entry(p, &br->port_list, list) {//在每个指定端口发送配置BPDUif (p->state != BR_STATE_DISABLED &&//端口使能br_is_designated_port(p))//为指定端口br_transmit_config(p);//发送配置BPDU}
}
//  使能端口
//  函数主要任务:
//      1.初始化端口
//      2.开启端口的状态选择
1.4 void br_stp_enable_port(struct net_bridge_port *p)
{br_init_port(p);//初始化端口br_port_state_selection(p->br);//开始执行端口状态的变化
}
//  初始化端口
//  调用路径:br_stp_enable_port->br_init_port
//  函数主要任务:
//      1.计算端口id
//      2.设置端口为指定角色
//      3.设置端口为阻塞状态
//      4.初始化端口的定时器
1.5 void br_init_port(struct net_bridge_port *p)
{p->port_id = br_make_port_id(p->priority, p->port_no);//创建端口idbr_become_designated_port(p);//使能端口时,端口均被指派为指定端口的角色p->state = BR_STATE_BLOCKING;//起始状态为阻塞态p->topology_change_ack = 0;//p->config_pending = 0;br_stp_port_timer_init(p);//初始化端口使用的三个定时器message age, forward delay,hold
}// 关闭网桥设备
//  函数主要任务:
//      1.disable网桥设备
//      2.关闭设备队列
//调用路径dev_close->br_dev_stop
2.1 static int br_dev_stop(struct net_device *dev)
{br_stp_disable_bridge(dev->priv);//disable网桥netif_stop_queue(dev);//修改dev->state,关闭传输传输return 0;
}// disable网桥
//  函数主要功能:
//      1.关闭所有端口
//      2.设置标志没有拓扑变化
//      3.删除网桥使用的定时器
//调用路径dev_close->br_dev_stop->br_stp_disable_bridge
2.2 void br_stp_disable_bridge(struct net_bridge *br)
{struct net_bridge_port *p;spin_lock(&br->lock);//获取桥的锁list_for_each_entry(p, &br->port_list, list) {if (p->state != BR_STATE_DISABLED)br_stp_disable_port(p);//关闭每个端口的stp,设置其为指定端口}br->topology_change = 0;br->topology_change_detected = 0;spin_unlock(&br->lock);//同步删除网桥的定时器del_timer_sync(&br->hello_timer);del_timer_sync(&br->topology_change_timer);del_timer_sync(&br->tcn_timer);
}// disable网桥端口:
//  函数主要任务:
//      1.设置为指定端口角色
//      2.删除端口使用的定时器
//      3.由于端口关闭而更新网桥配置
//      4.设置端口状态
//      3.由于端口的关闭,使非根网桥变为根网桥,更新网桥信息
//调用路径dev_close->br_dev_stop->br_stp_disable_bridge->br_stp_disable_port
2.3 void br_stp_disable_port(struct net_bridge_port *p)
{struct net_bridge *br;int wasroot;br = p->br;printk(KERN_INFO "%s: port %i(%s) entering %s state\n",br->dev->name, p->port_no, p->dev->name, "disabled");wasroot = br_is_root_bridge(br);//根网桥br_become_designated_port(p);//关闭端口stp时,也会重置端口为指定端口p->state = BR_STATE_DISABLED;//设置端口为关闭状态p->topology_change_ack = 0;p->config_pending = 0;//删除定时器del_timer(&p->message_age_timer);del_timer(&p->forward_delay_timer);del_timer(&p->hold_timer);//更新网桥配置br_configuration_update(br);//端口状态选择br_port_state_selection(br);//非根网桥转变为根网桥,if (br_is_root_bridge(br) && !wasroot)br_become_root_bridge(br);
}
//  成为网桥:
//  被调用情景:
//      当网桥由非根网桥变化为根网桥时,调用。
//  函数主要任务:
//      1.每个网桥在启动时,在birdge_max_age, bridge_hello_time, bridge_forward_delay字段保存当自己成为根网桥时使用的到期时间。
//      2.更新定时器使用的到期时间。
//      3.设置网桥发生了拓扑变化。
//      4.发送配置信息。
2.4 void br_become_root_bridge(struct net_bridge *br)
{br->max_age = br->bridge_max_age;br->hello_time = br->bridge_hello_time;br->forward_delay = br->bridge_forward_delay;br_topology_change_detection(br);//拓扑发生改变del_timer(&br->tcn_timer);if (br->dev->flags & IFF_UP) {//根网桥开启状态br_config_bpdu_generation(br);//发送配置信息mod_timer(&br->hello_timer, jiffies + br->hello_time);}
}// 拓扑发生变化:
//  函数主要任务:
//      1.如果为根网桥
//          1.1 启动topology_change_timer定时器
//          1.2 设置topology_change标志
//      2.非根网桥,之前没有检测到拓扑变化
//          2.1 发送设有tc标志的配置bpdu
//          2.2 启动tcn_timer定时器
//      3.设置topology_change_detected=1,表示拓扑变化被检测到。
2.5 void br_topology_change_detection(struct net_bridge *br)
{int isroot = br_is_root_bridge(br);if (isroot) {br->topology_change = 1;mod_timer(&br->topology_change_timer, jiffies+ br->bridge_forward_delay + br->bridge_max_age);} else if (!br->topology_change_detected) {br_transmit_tcn(br);mod_timer(&br->tcn_timer, jiffies + br->bridge_hello_time);}br->topology_change_detected = 1;
}

网络子系统32_网桥设备的开启与关闭相关推荐

  1. Linux网络子系统

    今天分享一篇经典Linux协议栈文章,主要讲解Linux网络子系统,看完相信大家对协议栈又会加深不少,不光可以了解协议栈处理流程,方便定位问题,还可以学习一下怎么去设计一个可扩展的子系统,屏蔽不同层次 ...

  2. 鲲鹏性能优化十板斧(三)——网络子系统性能调优

    1 网络子系统性能调优 3.1  调优简介 3.2  常用性能监测工具 3.3  优化方法 1.1 调优简介 调优思路 本章主要是围绕优化网卡性能和利用网卡的能力分担CPU的压力来提升性能.在高并发的 ...

  3. 一文搞定 | Linux 网络子系统

    今天分享一篇经典Linux协议栈文章,主要讲解Linux网络子系统,看完相信大家对协议栈又会加深不少,不光可以了解协议栈处理流程,方便定位问题,还可以学习一下怎么去设计一个可扩展的子系统,屏蔽不同层次 ...

  4. 网络子系统30_桥接子系统通用接口

    // 添加网桥设备 // 参数: // name,需要全局唯一 // 调用路径:socket ioctl->br_add_bridge// 函数主要任务: // 1.创建一个新的网络设备 // ...

  5. linux协议栈网桥部分之cam表操作,Docker网络基础 - Linux网桥工作原理与实现

    本文转载自微信公众号「Linux内核那些事」,作者songsong001 .转载本文请联系Linux内核那些事公众号. Linux 的 网桥 是一种虚拟设备(使用软件实现),可以将 Linux 内部多 ...

  6. 网络设计与网络设备配置,网络设计需要哪些设备

    在网络综合布线中信息点安装位置的选择有哪些原则? 按要求: 1.从智能楼宇角度考虑,应五个平方米一个信息点: 2.离顶或是地面30厘米位置设置墙壁内盒,住房套户不要安装在离窗户那面(因有窗帘),应在两 ...

  7. 计算机网络 | 网络互联技术与设备

    知识扩展:世界互联网大会 复习:OSI的七层参考模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 TCP/IP四层模型和OSI七层模型对表 OSI七层参考模型 对应网络协议 TCP/I ...

  8. 计算机网络——(6)网络互联技术与设备

    目录 网络互联概述 网络互联的概念 网络互联的目的和要求 网络互联设备 中继器 集线器 网桥 交换机 三层交换机 网关 路由器 广域网接入技术 广域网概述 常见的广域网接入技术 网络互联概述 网络互联 ...

  9. DSP6678网络子系统之交换子系统

    1 基本介绍 网络交换子系统由EMAC模块.SGMII模块.PHY设备.MDIO模块.网络交换机.以及系统集成的其他相关的子模块. NETCP的网络交换子系统的主要作用是提供一个在主设备和其他连接设备 ...

  10. MMC子系统识别SD设备过程简述

    一 :引子–WIFI 模块移植 二 : MMC 识别 SD设备过程 第一步: 注册虚拟总线 第二步: 初始化并挂载设备驱动 第三步:初始化注册主控驱动 第四步:Host驱动的prob() 4.1 mm ...

最新文章

  1. 删除windows7的隐藏分区
  2. 【Network Security!】服务器远程管理
  3. 深入浅出Node.js(一):什么是Node.js(转贴)
  4. 导航栏与scrollerview(或scrollerview的子类)
  5. Python 多进程pool.map()方法的使用
  6. python向上取整 向下取整
  7. python文本字符串比对_python-模糊字符串比较
  8. labelme标注文件转coco json,coco json转yolo txt格式,coco json转xml, labelme标注文件转分割,boxes转labelme json
  9. 总结CSS3新特性(媒体查询篇)
  10. 计算机三级信息管理技术考试大纲
  11. 2017.4.26 组合数问题 思考记录
  12. 《南溪的目标检测学习笔记》——图像预处理的学习笔记
  13. C#读写SQLSERVER中Image类型图片
  14. nginx 开机启动_4步配置Nginx + Keepalived + Havip,解决前端单点问题
  15. 二分图最大匹配(匈牙利算法) URAL 1721 Two Sides of the Same Coin
  16. Python中的二维数组定义
  17. Mstar 平台背光时序调试
  18. 【linux内核分析与应用-陈莉君】中断处理机制
  19. 如何改变computed执行_皓儿日记2019-11-09 《执行力》读书笔记
  20. [leetcode Q50] Pow(x, n)

热门文章

  1. Gram矩阵计算实例
  2. 单核工作法图解:事多到事少,拖延变高效
  3. 直接ISO启动工具ventoy
  4. Apex-逃离塔科夫机器码彻底解决(年度最新讲解可观看)
  5. win10电脑用命令行关机
  6. Imu_heading源码阅读(一)——common.h
  7. 读书笔记 - 《六神磊磊读唐诗》
  8. 五大理由!建议你选择中国电信 CTWing 物联网平台?
  9. 图解TCP/IP 读后感
  10. 身居乱世之中,重新审视“活法