桥设备及端口的开启和关闭(四)

关于设备的添加删除的基本动作,我们已经知道。
这节,我们看看关于网桥设备以及桥设备上的端口的启动和关闭。

我们说过,在初始化一个桥设备的时候有这样一个操作:
dev->netdev_ops = &br_netdev_ops;

br_netdev_ops这个参数,注册了很多函数,其中包括网桥设备的启动和关闭函数

br_dev_open和br_dev_stop,这两个函数的工作主要是初始化桥设备的一些队列和
桥设备上端口的一些启动和关闭动作。

启动和关闭网桥设备

br_dev_open相当与启动网桥的总设计师
static int br_dev_open(struct net_device *dev)
{
    struct net_bridge *br = netdev_priv(dev);
    /*重新更新网桥设备功能*/
    netdev_update_features(dev);
    /*函数启动进行设备传输*/
    netif_start_queue(dev);
    /*启动网桥设备*/
    br_stp_enable_bridge(br);
    /*初始化网桥本身的多播对列*/
    br_multicast_open(br);
    return 0;
}
static int br_dev_stop(struct net_device *dev)
{
    struct net_bridge *br = netdev_priv(dev);
    /*关闭网桥设备*/
    br_stp_disable_bridge(br);
    /*关闭网桥设备的多播队列*/
    br_multicast_stop(br);
    /*关闭设备的传输,任何企图在设备上传输信息的尝试都会被拒绝*/
    netif_stop_queue(dev);

    return 0;
}
启动网桥设备,当启动网桥设备时,先前绑定在该设备上的端口也会跟着启动
void br_stp_enable_bridge(struct net_bridge *br)
{
    struct net_bridge_port *p;
    /*锁定网桥*/
    spin_lock_bh(&br->lock);
    if (br->stp_enabled == BR_KERNEL_STP)
        mod_timer(&br->hello_timer, jiffies + br->hello_time);

    /* 当网桥启动时,设置次定时器,1/10秒到期一次 */
    mod_timer(&br->gc_timer, jiffies + HZ/10);
    /*TX配置bpdu*/
    br_config_bpdu_generation(br);

    list_for_each_entry(p, &br->port_list, list) {
        if (netif_running(p->dev) && netif_oper_up(p->dev))
            br_stp_enable_port(p);/*启动网桥设备的每个端口*/
    }
    /*给网桥解锁*/
    spin_unlock_bh(&br->lock);
}
关闭网桥设备
void br_stp_disable_bridge(struct net_bridge *br)
{
    struct net_bridge_port *p;

    spin_lock_bh(&br->lock);
    list_for_each_entry(p, &br->port_list, list) {
        if (p->state != BR_STATE_DISABLED)
            br_stp_disable_port(p);/*关闭网桥设备的每个端口*/
    }
    /*重新设置拓扑标识*/
    br->topology_change = 0;
    br->topology_change_detected = 0;
    spin_unlock_bh(&br->lock);

    /*删除在初始化桥设备时的定时器*/
    del_timer_sync(&br->hello_timer);
    del_timer_sync(&br->topology_change_timer);
    del_timer_sync(&br->tcn_timer);
    del_timer_sync(&br->gc_timer);
}

启动和关闭网桥端口

要启动网桥端口,必须满足下列几个条件
1.被管理的相关设备已用管理手段启动
2.被绑定的相关设备有载波状态
3.相关的网桥设备已用管理手段启动
注意:网桥设备上没有载波状态,因为网桥是虚拟设备。

当网桥是以用户空间命令建起来并且先前三个条件都满足时,该网桥端口就可以立即启用了

但是,假设当端口建立时,由于上述三项条件至少有一项不满足无法启动端口时,下面的条件是
每项条件最终满足时启用端口的场合:
1.当被关闭的网桥设备重新启动时,其所有关闭的端口就会启用
2.当被绑定的设备检测到载波状态时,桥程序会收到NETDE_CHANGE通知消息
3.当被关掉的版定设备重启时,桥程序会收到NETDEV_UP的通知消息

如若还不满足,网桥端口就会被关闭 
启动网桥上的端口
void br_stp_enable_port(struct net_bridge_port *p)
{
    /*初始化端口*/
    br_init_port(p);
    /*遍历所有端口,为端口指定合适的状态*/
    br_port_state_selection(p->br);
    /*捕捉一个端口变化信息的通知*/
    br_ifinfo_notify(RTM_NEWLINK, p);
}
关闭网桥上的端口
void br_stp_disable_port(struct net_bridge_port *p)
{
    struct net_bridge *br = p->br;
    int wasroot;
    /*判断是否是根网桥*/
    wasroot = br_is_root_bridge(br);
    /*分配制定角色*/
    br_become_designated_port(p);
    /*将关闭位置位*/
    br_set_state(p, BR_STATE_DISABLED);
    p->topology_change_ack = 0;
    p->config_pending = 0;

    br_ifinfo_notify(RTM_NEWLINK, p);
    /*删除定时器*/
    del_timer(&p->message_age_timer);
    del_timer(&p->forward_delay_timer);
    del_timer(&p->hold_timer);
    /*更改转发表信息*/
    br_fdb_delete_by_port(br, p, 0, 0);
    br_multicast_disable_port(p);
    /*更改桥的bpdu信息*/
    br_configuration_update(br);
    /*更新所有桥上端口的状态*/
    br_port_state_selection(br);
    /*处理非根网桥到根网桥的转移*/
    if (br_is_root_bridge(br) && !wasroot)
        br_become_root_bridge(br);
}
 注意,当网桥端口关闭时,非根网桥可能会变成根网桥
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
书名:《Visual C++串口通信技术详解》(机械工业出版社.李景峰.杨丽娜.潘恒) PDF格式扫描版,全书分为16章,共368页。2010年6月出版。 内容简介 本书介绍如何利用Visual C++集成开发环境进行串口通信程序开发。书中精选来自工程实践的应用范例,主要涵盖串口通信的理论基础、Visual c++集成开发环境简介、MSComm控件串口编程、Windows API串口编程、TAPI通信编程、串口实现双机互连、串口调试精灵、串口控制Modem设备、串口控制单片机、串口控制PLC、串口控制射频卡、串口控制GPS模块、串口控制云台摄像头、智能报警系统、语音自动应答系统以及USB转RS-232串口实例等。 本书通俗易懂,内容翔实,层次分明,注重知识的系统性、针对性和先进性,注重基础理论与工程实践之间的相互联系。书中实例的源代码均在随书光盘中提供,以方便读者学习和使用。 本书可作为具有一定Visual c++使用基础的读者开发串口通信程序的参考书,也可作为科研单位、高等院校相关专业技术人员的参考书 目录 前言 第一篇 基础理论和基本方法 第1章 串口通信理论基础 1.1 接口技术 1.1.1 接口的定义 1.1.2 接口的基本功能 1.1.3 接口的基本控制方式 1.1.4 并行接口技术 1.1.5 串行接口技术 1.2 RS-232C标准 1.2.1 RS-232C电气特性 1.2.2 RS-232C连接器机械特性 1.2.3 RS-232C的接口信号 1.2.4 RS-232C的通信方式 1.3 RS-422/RS-485标准 1.3.1 RS-422简介 1.3.2 RS-485简介 1.3.3 RS-422/RS-485网络安装注意点 1.4 SPI总线标准 1.4.1 SPI总线原理 1.4.2 SPI总线特点 1.5 USB总线标准 1.5.1 USB总线总体结构 1.5.2 USB数据传输逻辑结构 1.5.3 传输类型 1.6 使用串口通信的典型外设 1.6.1 Modem 1.6.2 传真机 1.6.3 GPS接收机 1.7 实践拓展 第2章 Visual C++集成开发环境简介 2.1 面向对象程序设计与C++语言 2.1.1 面向对象程序设计概述 2.1.2 C++语言基础 2.1.3 C++的面向对象特性 2.2 Visual C++6.0集成开发环境 2.2.1 visual C++6.0开发环境 2.2.2 项目与项目工作区 2.2.3 应用程序向导App Wizard 2.2.4 集成开发基本操作 2.2.5 联机帮助文件 2.3 MFC应用程序的创建 2.4 实践拓展 第3章 MSComm控件串口编程 3.1 MSComm控件简介 3.1.1 MSComm控件描述 3.1.2 MsComm控件常用属性 3.1.3 MSComm控件其他属性 3.1.4 MSComm控件的事件 3.2 MSComm控件编程步骤 3.2.1 加载MSComm控件到项目 3.2.2 初始化并打开串行端口 3.2.3 捕获串行端口事件 3.2.4 串行端口数据读写 3.2.5 关闭串行端口 3.2.6 程序发布问题 3.3 使用MsComm控件实现串口通信接收 3.4 实践拓展 第4章 Windows API串口编程 4.1 windows API串行编程概述 4.1.1 串行编程的数据结构 4.1.2 串行编程的Win32API函数 4.2 win32 API串口通信编程方式 4.2.1 打开串行端口 4.2.2 配置串行端口 4.2.3 读写串行端口 4.2.4 关闭串行端口 4.3 基于win32API函数实现串口通信发送程序 4.4 实践拓展 第5章 TAPI串口编程 5.1 TAPI概述 5.1.1 TAPI的含义 5.1.2 TAPI的体系结构 5.1.3 TAPI的服务类型 5.2 windows TAPI 2.x函数集 5.2.1 Windows TAPI编程流程 5.2.2 TAPI 2.x常用函数 5.3 使用TAPI实现电话拨打程序 5.4 实践拓展 第二篇 串口编程基础应用 第6章 串口实现双机互连 6.1 概述 6.2 通信协议及实现方案 6.2.1 异步串行通信 6.2.2 同步串行通信 6.3 实现代码分析 6.3.1 程序主体设计及关键模块分析 6.3.2 使用API通信 6.4 实践拓展 第7章 串口调试精灵 7.1 串口调试工具实现的基本要求 7.2 串口调试精灵的编程实现 7.2.1 软件功能及流程设计 7.2.2 程序界面分析 7.2.3 编程实现 7.2.4 使用测试 7.3 实践拓展 第8章 串口控制Modem设备 8.1 Modem接口 8.1.1 Modem简介 8.1.2 Modem工作流程 8.1.3 Modem通信方案 8.2 AT指令简介 8.2.1 Modem工作状态 8.2.2 AT指令集 8.3 使用Modem实现远程通信 8.3.1 使用单片机和Modem通信 8.3.2 使用PC和Modem通信 8.4 实践拓展 第9章 串口控制单片机 9.1 串口通信硬件设计 9.1.1 MCS.5 1系列单片机的串口原理 9.1.2 常用的接口芯片介绍 9.1.3 接口电路设计 9.2 串口通信参数设置 9.2.1 波特率设置 9.2.2 奇偶校验位的使用方法 9.2.3 通信协议约定 9.3 系统总体设计 9.4 单片机的串口编程方法 9.5 计算机端通信界面设计 9.6 计算机端程序设计 9.6.1 头文件引用及变量声明 9.6.2 控件加载及控件属性设置 9.6.3 发出读数据请求 9.6.4 接收数据的处理 9.6.5 关闭串口 9.7 实践拓展 第10章 串口控制PLC 10.1 PLC概述 10.1.1 PLC基本结构 10.1.2 PLC串行接口规范 10.1.3 通信协议 10.2 PLC串口通信 10.2.1 计算机与PLC之间的通信流程 10.2.2 PLC通信编程 10.3 实现代码分析 10.3.1 界面设计 10.3.2 程序设计核心代码 10.4 实践拓展 第11章 串口控制射频卡 11.1 射频卡概述 11.1.1 射频卡原理 11.1.2 射频卡分类及应用 11.1.3 典型射频卡模块 11.2 射频卡应用设计 11.2.1 读写器设计 11.2.2 基于射频卡模块的设计 11.3 实现代码分析 11.3.1 界面设计 11.3.2 串口通信程序设计 11.4 实践拓展 第12章 串口控制GPS模块 12.1 GPS系统的基础知识 12.1.1 GPS定位原理 12.1.2 GPS系统 12.2 LEA-4H型GPS模块的性能及其应用 12.3 NMEA-0183协议分析 12.3.1 NMEA-0183协议的定义 12.3.2 NMEA-0183数据信息 12.4 主机与GPS模块串口通信的程序实现 12.4.1 MSComm控件属性 12.4.2 添加MSComm控件 12.4.3 添加串口事件消息处理函数OnComm() 12.4.4 数据的接收与提取 12.4.5 实验结果及数据的显示 12.5 实践拓展 第三篇 串口编程高级应用 第13章 串口控制云台摄像头 13.1 云台摄像头 13.1.1 云台简介 13.1.2 摄像头及控制电路 13.2 云台控制协议 13.3 控制程序分析 13.3.1 添加控件 13.3.2 设置界面 13.3.3 主控程序 13.3.4 初始化 13.3.5 配置按钮 13.3.6 通信参数的设置 13.3.7 云台控制命令 13.3.8 旋转控制按钮和镜头控制按钮 13.4 实践拓展 第14章 智能报警系统 14.1 系统描述 14.2 系统分析与设计 14.3 关键技术 14.3.1 建立安防信息数据库 14.3.2 端口设置和定时读取I/O端口数据 14.3.3 判断是否有触发事件 14.3.4 启动并口控制的报警设备 14.3.5 根据设置拨打报警电话 14.3.6 安防日志管理 14.3.7 I/O端口通信 14.4 实现代码分析 14.4.1 创建项目 14.4.2 界面设计与实现 14.4.3 加入数据库支持 14.4.4 关键程序类的实现 14.5 实践拓展 第15章 语音自动应答系统 15.1 功能描述 15.1.1 TAPI介绍 15.1.2 功能介绍 15.1.3 实验要求 15.2 设计流程实现 15.2.1 程序设计流程图 15.2.2 TAPI 3.0方法介绍 15.2.3 串处理分析介绍 15.3 具体功能实现 15.3.1 程序主界面 15.3.2 参数配置 15.3.3 选择语音界面 15.4 实践拓展 第16章 USB转RS-232串口实例 16.1 USB总线技术简介 16.1.1 USB的特点 16.1.2 USB的体系结构 16.1.3 USB的电气特性 16.1.4 USB的数据通信协议 16.2 功能描述 16.3 USB总线转换芯片CH341简介 16.3.1 CH341异步串口工作方式 16.3.2 CH341功能配置 16.4 USB转RS-232接器硬件设计 16.5 驱动程序安装 16.6 实践拓展 附录 Modem AT命令集 参考文献

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值