Linux内核中有两种获取网络设备的桥接口方法,其中一种是在控制路径上;另一种是在数据路径上。

控制路径

用户平面的程序brctl下发控制命令,比如setpathcost和setportprio命令以port number为参数下发到内核,内核使用br_get_port函数遍历网桥上的接口列表,最终找到对应的网桥接口。br_get_port函数需要在获得了网桥spinlock锁后调用,防止对port_list操作的不一致发送。

Usage: brctl [commands]
commands:setpathcost     <bridge> <port> <cost>  set path costsetportprio     <bridge> <port> <prio>  set port prioritystruct net_bridge_port *br_get_port(struct net_bridge *br, u16 port_no)
{struct net_bridge_port *p;list_for_each_entry_rcu(p, &br->port_list, list) {if (p->port_no == port_no)return p;}
}

数据路径

在数据路径上,调用函数br_port_get_rcu获取对应网桥接口,效率高于控制路径上的br_get_port函数。首先在添加桥接口时(br_add_if),调用函数(netdev_rx_handler_register)注册rx_handler,将网桥接口赋值给rx_handler_data变量,在数据路径上,比如br_handle_frame_finish中,使用br_port_get_rcu可直接获得网桥接口结构体。

static inline struct net_bridge_port *br_port_get_rcu(const struct net_device *dev)
{return rcu_dereference(dev->rx_handler_data);
}int netdev_rx_handler_register(struct net_device *dev,rx_handler_func_t *rx_handler,void *rx_handler_data)
{rcu_assign_pointer(dev->rx_handler_data, rx_handler_data);rcu_assign_pointer(dev->rx_handler, rx_handler);
}
int br_add_if(struct net_bridge *br, struct net_device *dev)
{struct net_bridge_port *p;p = new_nbp(br, dev);err = netdev_rx_handler_register(dev, br_handle_frame, p);
}

内核版本

Linux-3.10.0

内核获取网络设备的网桥接口相关推荐

  1. 【VS开发】使用WinPcap编程(1)——获取网络设备信息

    pcap_if_t是一个interface数据结构,表明网络接口的信息.网络接口就是interface,就是我们用来上网的设备,一般为网卡,还有一些虚拟网卡也算作这样的接口.它的结构如下: struc ...

  2. 网桥接口非混杂模式下数据包转发

    网桥接口处在非混杂模式下,只能接收目的MAC地址为自身的数据包,也就是说如果数据包的目的MAC为其它地址,将会被丢弃掉.对于单网口的设备这样没有问题,但是对于存在多个网卡的交换设备,如果从一个网口接收 ...

  3. C语言socket getsockopt() setsockopt()函数(获取和设置套接口的选项?)

    文章目录 man 文档(越看越懵逼啊!) 解释 getsockopt()函数用于获取任意类型.任意状态套接口的选项当前值,并把结果存入optval. setsockopt()函数用于任意类型.任意状态 ...

  4. jmeter根据循环获取参数_jmeter forEach循环获取response参数值进行接口请求

    jmeter forEach循环获取response参数值进行接口请求 注意: 一,ForEach控制器 输入变量前缀:输入正则表达式变量的引用名称即可 Start index for loop(ex ...

  5. Linux 内核获取、初次编译、源码目录分析

    目录 Linux 内核获取 Linux 内核初次编译 Linux 内核源码目录分析 1.arch 目录 2.block 目录 3.crypto 目录 4.Documentation 目录 5.driv ...

  6. 字符设备驱动高级篇6——内核提供的读写寄存器接口

    以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 1.前面访问寄存器的方式 通过定义指向寄存器的指针,然后解引用来对寄存器进行操作. (1)行不行?sure! (2 ...

  7. Linux3种进程,linux内核获取进程的全路径3种方法

    本文档的CopyRight归jonathan所有,可自由转载,转载时请保持文档的完整性. /*----------------------------------------------------- ...

  8. VUE获取网易云音乐接口,并实现歌词滚动效果

    VUE获取网易云音乐接口,并实现歌词滚动效果 最近在捣腾个人博客,加了个播放音乐的模块,所以在这里记录一下歌曲播放歌词实时滚动效果的实现,顺便总结加深一下对各个知识点的理解. GitHub地址 演示地 ...

  9. 不写一段代码来获取扇贝单词的接口数据

    不写一段代码来获取扇贝单词的接口数据 第一步,登录并寻找可以爬取的数据(想直接看结论可以到第四步) 第二步,对症下药 第三步,解密接口 第四步,使用现成的方法获取数据 最近想做一个背单词相关的app, ...

  10. 淘宝获取商品详情API接口

    淘宝获取商品详情API接口如下: 淘宝获取商品详情API返回参数: data.productTitle string 商品标题 data.productId string 商品ID data.sell ...

最新文章

  1. oracle数据库按照城市分组_大数据分组怎样才会更快
  2. Serverless 下的微服务实践
  3. SpringMVC-applicationContent.xml和Spring-servlet.xml的配置设置
  4. 2009-12-12
  5. HDU - 3336 next运用+递推
  6. Oracle Library Cache 的 lock 与 pin 说明
  7. Java语法糖之foreach
  8. 今日推荐:如何设计一个支撑数亿用户的系统
  9. 1^2+2^2+……+n^2的公式证明
  10. java 找不到符号 con_我的java程序运行时,提示找不到符号,求解!
  11. windows安装MySQL数据库【附安装文档和安装包】
  12. Nature公开1300多篇论文工厂论文的期刊分布,这个杂志高居榜首
  13. 国内首家!腾讯云密钥管理系统通过密码应用验证,积极探索行业标准边界
  14. 用后端接口调试工具Insomnia发送请求
  15. 【TSP】基于matlab GUI蚁群算法求解旅行商问题【含Matlab源码 929期】
  16. iOS获取DSYM文件
  17. isSelected() 的使用
  18. 给设计团队管理者的6个建议
  19. python开发板卡驱动开发_IC卡驱动程序开发
  20. win10无法登录到你的账户->注销->重启->桌面初始化(只剩回收站+默认浏览器)等一系列问题出现

热门文章

  1. excel常用函数公式及技巧搜集4
  2. 数据结构问题解决2.1——单链表存储结构定义详细解释,struct LNode* next解释,为啥next定义成指针类型
  3. VMware安装win7操作系统
  4. 四种XML解析方式详解
  5. 最最最简单从官方获取最新行政区划代码、区划拼音
  6. mac虚拟机服务器设置u盘启动不了,mac虚拟机如何使用u盘启动盘
  7. 世界各国时区表以及与北京时差
  8. openg离线包_高级openg 混合,一个完整程序
  9. 论文笔记:Bridging Textual and Tabular Data for Cross-Domain Text-to-SQL Semantic Parsing
  10. 2021年中国纯碱行业发展现状分析,下游需求快速增长,供需关系紧张导致价格走高「图」